Come impostare la larghezza di DialogFragment su Fill_Parent


95

Sto lavorando su un'applicazione Android in cui sto usando DialogFragmentper visualizzare la finestra di dialogo ma la sua larghezza è molto piccola. Come posso rendergli questa larghezza fill_parent?

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
In realtà, lo stesso identico layout che utilizza RelativeLayout viene visualizzato molto bene. Non lo spiego però ...
— Dan Chaltiel

Risposte:


154

Questa è la soluzione che ho trovato per gestire questo problema:

@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));
    }
}

Modificare:

È possibile utilizzare il codice seguente nel onCrateViewmetodo di Fragment prima di restituire la visualizzazione gonfiata.

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

3
Puoi semplicemente chiamaredialog.getWindow().setBackgroundDrawable(null);
— edwardaa

se è impostato a zero, non è trasparente ... solo nero, il 4.0.4
— Joao Polo

17
Per me, funziona se inserisco getDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);il onResume()metodo DialogFragment . Non ha funzionato con il onCreateView()metodo. Ho modificato leggermente la risposta da dialoga getDialog().
— Rock Lee

2
setLayoutnel onStartmetodo funziona perfettamente. Grazie.
— wonsuc

78

Hai provato a utilizzare la risposta di Elvis da Come fare in modo che una finestra di dialogo di avviso riempia il 90% delle dimensioni dello schermo ?

È il seguente:

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

Aggiornare:

Il codice sopra dovrebbe essere aggiunto all'interno del onStart()metodo di DialogFragment.


4
Quali LayoutParams hai importato?
— ymerdrengene

1
@ymerdrengene Domanda davvero molto buona. Prova WindowManager.LayoutParams.FILL_PARENT.
— EpicPandaForce

2
@ymerdrengene anche se tecnicamente, stanno tutti ereditando questo valore da ViewGroup.LayoutParams, quindi funziona perfettamente in entrambi i casi.
— EpicPandaForce

9
Questo codice dovrà essere nel onStartmetodo del DialogFragment per funzionare.
— Eborbob

1
Come accennato qui stackoverflow.com/a/15279400/1641882 , suggerirei di spostare questo codice inonCreateDialog
— Ishan

52

Questo ha funzionato per me

Crea il tuo stile personalizzato:

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

Puoi anche provare a usare il genitore giusto per abbinare gli altri tuoi dialoghi. per esempio parent="ThemeOverlay.AppCompat.Dialog"e così via.

Usa questo stile nella tua finestra di dialogo

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
bella soluzione con <item name = "android: windowBackground"> ​​@ null </item>.
— Evgeny Sinitsky

1
abbi cura di usare il genitore giusto per abbinare gli altri tuoi dialoghi. nel mio caso era ThemeOverlay.AppCompat.Dialog
— quealegriamasalegre

29

Per me, ha funzionato quando ho sostituito il genitore LinearLayout del layout gonfiato in onCreateView da RelativeLayout. Nessun'altra modifica del codice richiesta.


6
Tipica, sempre la risposta più impopolare sullo stack overflow risolve il mio problema. Grazie
— busuu

1
Mi è piaciuta molto questa risposta ma non è il motivo per cui funziona solo per il layout relativo?
— 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" />

nella parte superiore della mia finestra di dialogo layout ha fatto il trucco.


3
Questo funziona per me, e mi piace che non ci richieda di aggiungere nulla in più nel codice, ma mi chiedo perché funziona ...
— shela

Incredibilmente, questa è l'unica cosa che ha funzionato per me. Lo stile personalizzato no.
— 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);
    }
}

e se vuoi molta più flessibilità puoi estendere AppCompat_Dialog_Alert e attributi personalizzati


12

Sulla base di altre soluzioni, ho creato la mia.

<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

Nel mio caso ho utilizzato anche il seguente approccio:

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

Ma c'erano ancora piccoli spazi tra i bordi sinistro e destro della finestra di dialogo e i bordi dello schermo su alcuni dispositivi Lollipop + (ad esempio Nexus 9).

Non era ovvio ma alla fine ho capito che per renderlo a tutta larghezza su tutti i dispositivi e le piattaforme lo sfondo della finestra dovrebbe essere specificato all'interno di styles.xml come segue:

<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>

E ovviamente questo stile deve essere utilizzato quando creiamo la finestra di dialogo come la seguente:

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

2
Questa dovrebbe essere la risposta accettata! Mi ha fatto risparmiare così tanto tempo! Lo sfondo della finestra ha funzionato.
— Karan

10

Voglio chiarire questo. Entrambi i modi sono giusti, ma con DialogFragment diverso .

Utilizzando 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);
    }
}

Utilizzando 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);
}

Fondamentalmente avevo bisogno di tutta la larghezza e questo ha funzionato. Grazie!
— sud007

4

Un'altra soluzione che funziona per me senza effetti collaterali è stata:

Nella tua classe che estende DialogFragment:

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

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

Nei tuoi stili:

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

puoi utilizzare direttamente il tema dell'avviso insetStyle()
— Sony

3

Questo funziona perfettamente per me.

android:minWidth="300dp"

In questo modo puoi dare la larghezza al dialogo Fragment.


2

User AlertDialog.Builder all'interno del tuo DialogFragment. Aggiungilo in un onCreateDialogmetodo come questo. E onCreateViewnon fare nulla.

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

Crea uno stile personalizzato nel tuo file style.xml. Basta copiare e incollare questo codice nel file style.xml

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

Quindi nel metodo createDialog del tuo DialogFragment, crea l'oggetto dialog in base al codice

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

Questo sta funzionando per me e spero che questo possa aiutare anche te


Ho dovuto aggiungere quanto segue allo stile per farlo funzionare per me: <item name = "android: windowMinWidthMajor"> 100% </item> <item name = "android: windowMinWidthMinor"> 100% </item>
— Arnout

2

È così che ho risolto quando ho affrontato questo problema. Prova questo.

nel tuo DialogFragment's onActivityCreated, aggiungi questo codice in base alle tue necessità ....

 @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

usalo nel metodo onCreateView di DialogFragment

    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 è l'altezza del frammento di dialogo, modificalo come desideri


1

nella radice del layout, imposta android: minWidth su un valore molto grande, ad esempio

<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

Ho provato più risposte elencate sopra; non hanno funzionato per me. Questa è la soluzione al mio problema:

In DialogFragment(), aggiungi i codici seguenti:

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)
        }
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.