DialogFragment genişliği Fill_Parent'e nasıl yapılır


100

DialogFragmentDiyaloğu görüntülemek için kullandığım bir android uygulaması üzerinde çalışıyorum, ancak genişliği çok küçük. Bu genişliği fill_parentona nasıl yapabilirim ?

public class AddNoteDialogFragment extends DialogFragment {

    public AddNoteDialogFragment() {
        // Empty constructor required for DialogFragment
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        getDialog().setTitle(getString(R.string.app_name));
        View view = inflater.inflate(R.layout.fragment_add_note_dialog,
                container);

        return view;
    }


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);

        // request a window without the title
        dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);

        return dialog;
    }
}

fragment_add_note_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin" >

    <EditText
        android:id="@+id/addNoteEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="top"
        android:hint="@string/clock_enter_add_note"
        android:imeOptions="actionDone"
        android:inputType="textCapSentences|textMultiLine"
        android:lines="5" />

    <Button
        android:id="@+id/submit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:background="@drawable/login_button"
        android:text="@string/submit_button"
        android:textColor="@android:color/white" />

</LinearLayout>


3
Aslında, RelativeLayout kullanan tam olarak aynı düzen çok iyi görüntüleniyor. Bunu açıklamıyorum ama ...
Dan Chaltiel

Yanıtlar:


158

Bu sorunu çözmek için bulduğum çözüm bu:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);    
    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);

    return dialog;
}

@Override
public void onStart() {
    super.onStart();

    Dialog dialog = getDialog();
    if (dialog != null) {
       dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
       dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    }
}

Düzenle:

onCrateViewŞişirilmiş görünümü döndürmeden önce aşağıdaki kodu Fragment yönteminde kullanabilirsiniz .

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

3
Sadece arayabilirsindialog.getWindow().setBackgroundDrawable(null);
edwardaa

boş olarak ayarlanmışsa, şeffaf olmaz ... yalnızca siyah, 4.0.4'te
Joao Polo

18
Benim için, getDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);DialogFragment onResume()yöntemini koyarsam işe yarıyor . onCreateView()Yöntem üzerinde işe yaramadı . Cevabı biraz ile olarak dialogdeğiştirdim getDialog().
Rock Lee

2
setLayoutiçinde onStartyöntemle mükemmel çalışıyor. Teşekkürler.
wonsuc

82

Elvis'in " Bir uyarı iletişim kutusu nasıl ekran boyutunun% 90'ını doldurur ? " Bölümündeki yanıtını kullanmayı denediniz mi?

Şunlardır:

dialog.getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

Güncelleme:

Yukarıdaki kod içine eklenmelidir onStart()yöntemi DialogFragment.


4
Hangi LayoutParams'ı içe aktardınız?
ymerdrengene

1
@ymerdrengene Aslında çok güzel bir soru. Deneyin WindowManager.LayoutParams.FILL_PARENT.
EpicPandaForce

2
@ymerdrengene teknik olarak, hepsi sadece bu değeri miras alıyorlar ViewGroup.LayoutParams, bu yüzden her iki şekilde de mükemmel çalışıyor.
EpicPandaForce

1
Burada belirtildiği gibi stackoverflow.com/a/15279400/1641882 Bu kodu onCreateDialog
İşhan

1
ithal android.view.WindowManager;
kirti

54

Bu benim için çalıştı

Özel stilinizi yaratın:

   <style name="DialogStyle" parent="Base.Theme.AppCompat.Dialog">
    <item name="android:windowMinWidthMajor">97%</item>
    <item name="android:windowMinWidthMinor">97%</item>
   </style>

Diğer diyaloglarınıza uyması için doğru ebeveyni kullanmayı da deneyebilirsiniz. örneğin parent="ThemeOverlay.AppCompat.Dialog"ve benzeri.

Bu stili diyaloğunuzda kullanın

public class MessageDialog extends DialogFragment {

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogStyle);
}

// your code 
}

3
<item name = "android: windowBackground"> ​​@ null </item> ile güzel bir çözüm.
Evgeny Sinitsky

1
diğer diyaloglarınıza uyması için doğru ebeveyni kullanmaya özen gösterin. benim durumumda ThemeOverlay.AppCompat.Dialog oldu
quealegriamasalegre

32

Benim için, onCreateView'da RelativeLayout ile şişirilmiş düzenin LinearLayout ebeveynini değiştirdiğimde işe yaradı. Başka bir kod değişikliği gerekmez.


6
Tipik olarak, yığın taşmasıyla ilgili her zaman en popüler olmayan yanıt sorunumu çözer. Teşekkürler
busuu

1
Bu yanıtı çok beğendim, ancak yalnızca göreceli düzen için çalışmasının nedeni değil mi?
Prateek Gupta

19
    <!-- A blank view to force the layout to be full-width -->
    <View
        android:layout_width="wrap_content"
        android:layout_height="1dp"
        android:layout_gravity="fill_horizontal" />

iletişim düzenimin üst kısmında hile yaptım.


3
Bu benim için çalışıyor ve koda fazladan bir şey eklememizi gerektirmemesini seviyorum, ancak neden işe yaradığını merak ediyorum ...
shela

İnanılmaz bir şekilde, bu benim için işe yarayan tek şey. Özel stil olmadı.
Magnus W

19
public class FullWidthDialogFragment extends AppCompatDialogFragment {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NORMAL, R.style.Theme_AppCompat_Light_Dialog_Alert);
    }
}

ve daha fazla esneklik istiyorsanız, AppCompat_Dialog_Alert ve özel nitelikleri genişletebilirsiniz


12

Diğer çözümlere dayanarak kendi çözümümü yarattım.

<style name="AppTheme.Dialog.Custom" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowMinWidthMajor">100%</item>
    <item name="android:windowMinWidthMinor">100%</item>
</style>
abstract class BaseDialogFragment : DialogFragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setStyle(DialogFragment.STYLE_NO_TITLE, R.style.AppTheme_Dialog_Custom)
    }
}

11

Benim durumumda aşağıdaki yaklaşımı da kullandım:

    @Override
    public void onStart() {
        super.onStart();
        getDialog().getWindow().setLayout(LayoutParams.MATCH_PARENT, (int) getResources().getDimension(R.dimen.dialog_height));
    }
}

Ama yine de küçük boşluklar vardı bazı Lollipop + cihazlarında (örneğin Nexus 9) iletişim kutusunun sol ve sağ kenarları ile ekran kenarları arasında .

Belli değildi ama nihayet bunu yapmak anladım tam genişlikte cihazlar ve platformlar tümündeki penceresi arka iç belirtilmelidir styles.xml aşağıdaki gibi:

<style name="Dialog.NoTitle" parent="Theme.AppCompat.Dialog">
    <item name="android:windowNoTitle">true</item>
    <item name="android:padding">0dp</item>
    <item name="android:windowBackground">@color/window_bg</item>
</style>

Ve elbette, aşağıdaki gibi bir diyalog oluşturduğumuzda bu stilin kullanılması gerekiyor:

    public static DialogFragment createNoTitleDlg() {
        DialogFragment frag = new Some_Dialog_Frag();
        frag.setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Dialog_NoTitle);
        return frag;
}

2
Kabul edilen cevap bu olmalı! Beni çok zaman kurtardı! Pencere arka planı hile yaptı.
Karan

11

Bunu açıklığa kavuşturmak istiyorum. Her iki yol da doğrudur, ancak farklı DialogFragment ile .

Kullanma android.app.DialogFragment

@Override
public void onStart()
{
    super.onStart();
    Dialog dialog = getDialog();
    if (dialog != null)
    {
        int width = ViewGroup.LayoutParams.MATCH_PARENT;
        int height = ViewGroup.LayoutParams.MATCH_PARENT;
        dialog.getWindow().setLayout(width, height);
    }
}

Kullanma android.support.v4.app.DialogFragment

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
}

Temelde tam genişliğe ihtiyacım vardı ve bu işe yaradı. Teşekkürler!
sud007

4

Yan etkileri olmadan benim için çalışan başka bir çözüm şuydu:

DialogFragment'ı genişleten sınıfınızda:

@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogStyle);
}

Tarzlarınızda:

<style name="DialogStyle" parent="ThemeOverlay.AppCompat.Dialog.Alert"></style>

uyarı temasını doğrudan setStyle()
Sony

4

Bu benim için mükemmel çalışıyor.

android:minWidth="300dp"

Bu sayede diyalog Parçasına genişlik verebilirsiniz.


2

DialogFragment içinde Kullanıcı AlertDialog.Builder. Bunun gibi bir onCreateDialogyöntemle ekleyin . Ve onCreateViewhiçbir şey yapmayın.

public Dialog onCreateDialog(Bundle savedInstanceState)
{

    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
    View view = LayoutInflater.from(getContext()).inflate(R.layout.gf_confirm_order_timeout_dialog, null);
    final Bundle args = getArguments();
    String message = args.getString(GfConstant.EXTRA_DATA);
    TextView txtMessage = (TextView) view.findViewById(R.id.txt_message);
    txtMessage.setText(message);

    view.findViewById(R.id.btn_confirm).setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            if (mListener != null)
            {
                mListener.onDialogConfirmOK();
            }
        }
    });
    builder.setView(view);
    Dialog dialog = builder.create();
    dialog.setCanceledOnTouchOutside(false);
    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    return dialog;
}

2

Style.xml dosyanızda özel bir stil oluşturun. Bu kodu kopyalayıp style.xml dosyanıza yapıştırmanız yeterlidir.

<style name="CustomDialog" parent="@android:style/Theme.Holo.Light" >
    <item name="android:windowBackground">@null</item>
    <item name="android:windowIsFloating">true</item>
</style>

Ardından, DialogFragment'ınızın createDialog yönteminde, koda göre diyalog nesnesini oluşturun.

 dialog = new Dialog(getActivity(), R.style.CustomDialog);

Bu benim için çalışıyor ve umarım bu sana da yardımcı olur


Benim için çalışmasını sağlamak için stile şunu eklemem gerekiyordu: <item name = "android: windowMinWidthMajor">% 100 </item> <item name = "android: windowMinWidthMinor">% 100 </item>
Arnout

2

Bu sorunla karşılaştığımda böyle çözdüm. Bunu dene.

DialogFragment'inizin onActivityCreated bölümüne, ihtiyacınıza göre bu kodu ekleyin ....

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        myview=inflater.inflate(R.layout.fragment_insurance_detail, container, false);
        intitviews();
        return myview;
    }
    @Override
    public void onActivityCreated(Bundle arg0) {
        super.onActivityCreated(arg0);
        getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        getDialog().getWindow().setGravity(Gravity.CENTER);
    }

1

bunu DialogFragment'ın onCreateView yönteminde kullanın

    Display display = getActivity().getWindowManager().getDefaultDisplay();
    int width = display.getWidth();
    int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, **220**, getResources().getDisplayMetrics());
    getDialog().getWindow().setLayout(width,px);

220 , diyalog parçası yüksekliğidir, istediğiniz gibi değiştirin


1

mizanpaj kökünüzde android: minWidth'i çok büyük bir değere ayarlayın, örn.

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:minWidth="9999999dp">

   ...

</LinearLayout>

0

Yukarıda listelenen birden çok yanıtı denedim; benim için çalışmadılar. Sorunumun çözümü bu:

Olarak DialogFragment(), kodları aşağıda ekleyin:

override fun onResume() {
    super.onResume()
    if (showsDialog) {
        val width = ViewGroup.LayoutParams.MATCH_PARENT
        val height = ViewGroup.LayoutParams.WRAP_CONTENT
        dialog?.window?.apply {
            setBackgroundDrawable(ColorDrawable(Color.WHITE))
            attributes.gravity = Gravity.BOTTOM
            setLayout(width, height)
        }
    }
}

0

seçenek 1. oncreate in activity'e aşağıdaki kodu ekleyin

 getDialog().getWindow()
         .setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);

veya Dialog için özel bir stil oluşturabilirsiniz

<style name="CustomDialog" parent="AppTheme" >
  <item name="android:windowNoTitle">true</item>
  <item name="android:windowFullscreen">true</item>
  <item name="android:windowIsFloating">true</item>
  <item name="android:windowCloseOnTouchOutside">true</item>
</style>
then use that style in dialog fragment
@Override public void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setStyle(DialogFragment.STYLE_NORMAL, R.style.CustomDialog);
}

@Override public void onStart() {
  super.onStart();
  getDialog().getWindow()
    .setLayout(WindowManager.LayoutParams.MATCH_PARENT,
        WindowManager.LayoutParams.MATCH_PARENT);
}

SampleDialogFragment sampleDialogFragment = new SampleDialogFragment();
SampleDialogFragment.show(getActivity().getSupportFragmentManager(), "sometag");

VEYA aşağıdaki kodu şık bir şekilde denerseniz size yardımcı olacaktır

<item name="android:windowBackground">@null</item>

2.Çözüm: dialog.window.setLayout

class TestDialog : DialogFragment() {

    override fun onStart() {
        super.onStart()

        dialog?.window?.setLayout(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)
    }

}

-1

ConstraintLayoutKök düzeni olarak kullanılıyorsa, herhangi bir ek kod olmadan tam genişliğe gider .

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

</androidx.constraintlayout.widget.ConstraintLayout>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.