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.