Cómo hacer que el ancho de DialogFragment sea Fill_Parent


95

Estoy trabajando en una aplicación de Android en la que estoy usando DialogFragmentpara mostrar el diálogo, pero su ancho es muy pequeño. ¿Cómo puedo ajustar este ancho 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
En realidad, el mismo diseño exacto usando RelativeLayout se muestra muy bien. Aunque no explico eso ...
Dan Chaltiel

Respuestas:


154

Esta es la solución que descubrí para manejar este 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));
    }
}

Editar:

Puede utilizar el siguiente código en el onCrateViewmétodo de Fragmento antes de devolver la vista inflada.

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

3
Puede llamardialog.getWindow().setBackgroundDrawable(null);
edwardaa

si se establece en nulo, no es transparente ... solo negro, en 4.0.4
Joao Polo

17
Para mí, funciona si pongo getDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);el onResume()método de DialogFragment . No funcionó en el onCreateView()método. Modifiqué ligeramente la respuesta de dialoga getDialog().
Rock Lee

2
setLayouten el onStartmétodo funciona perfectamente. Gracias.
wonsuc

78

¿Ha intentado usar la respuesta de Elvis de Cómo hacer que un diálogo de alerta llene el 90% del tamaño de la pantalla ?

Es el siguiente:

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

Actualizar:

El código anterior debe agregarse dentro del onStart()método de DialogFragment.


4
¿Qué LayoutParams importó?
ymerdrengene

1
@ymerdrengene Muy buena pregunta en realidad. Prueba WindowManager.LayoutParams.FILL_PARENT.
EpicPandaForce

2
@ymerdrengene aunque técnicamente, todos están heredando este valor ViewGroup.LayoutParams, por lo que funciona perfectamente bien de cualquier manera.
EpicPandaForce

9
Este código deberá estar en el onStartmétodo de DialogFragment para funcionar.
Eborbob

1
Como se menciona aquí stackoverflow.com/a/15279400/1641882 , sugeriría mover este código aonCreateDialog
Ishan

52

Esto funcionó para mí

Crea tu estilo personalizado:

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

También puede intentar utilizar el padre correcto para que coincida con sus otros diálogos. por ejemplo parent="ThemeOverlay.AppCompat.Dialog"y así sucesivamente.

Usa este estilo en tu diálogo

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
hermosa solución con <item name = "android: windowBackground"> ​​@ null </item>.
Evgeny Sinitsky

1
tenga cuidado de utilizar el padre correcto para que coincida con sus otros diálogos. en mi caso fue
ThemeOverlay.AppCompat.Dialog

29

Para mí, funcionó cuando reemplacé el padre LinearLayout del diseño inflado en onCreateView por RelativeLayout. No se requiere ningún otro cambio de código.


6
Típico, siempre la respuesta más impopular en el desbordamiento de pila resuelve mi problema. Gracias
busuu

1
Me gustó mucho esta respuesta, pero ¿no es la razón por la que funciona solo para el diseño 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" />

en la parte superior de mi diseño de diálogo hizo el truco.


3
Esto funciona para mí, y me gusta que no requiera que agreguemos nada adicional en el código, pero me pregunto por qué funciona ...
shela

Increíblemente, esto es lo único que funcionó para mí. El estilo personalizado no lo hizo.
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);
    }
}

y si desea mucha más flexibilidad puede extender AppCompat_Dialog_Alert y atributos personalizados


12

Basado en otras soluciones, he creado la mía propia.

<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

En mi caso también utilicé el siguiente enfoque:

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

Pero todavía había pequeños espacios entre los bordes izquierdo y derecho del diálogo y los bordes de la pantalla en algunos dispositivos Lollipop + (por ejemplo, Nexus 9).

No era obvio, pero finalmente descubrí que para que sea de ancho completo en todos los dispositivos y plataformas , el fondo de la ventana debe especificarse dentro de styles.xml de la siguiente manera:

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

Y, por supuesto, este estilo debe usarse cuando creamos el diálogo como el siguiente:

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

2
¡Esta debería ser la respuesta aceptada! ¡Me salvó tanto tiempo! El fondo de la ventana funcionó.
Karan

10

Quiero aclarar esto. Ambas formas son correctas, pero con diferentes DialogFragment .

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

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

Básicamente necesitaba ancho completo y esto funcionó. ¡Gracias!
sud007

4

Otra solución que me funcionó sin efectos secundarios fue:

En su clase que extiende DialogFragment:

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

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

En tus estilos:

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

puede usar directamente el tema de alerta ensetStyle()
Sony

3

Esto me funciona perfectamente.

android:minWidth="300dp"

A través de esto, puede dar el ancho al fragmento de diálogo.


2

User AlertDialog.Builder dentro de su DialogFragment. Agréguelo en un onCreateDialogmétodo como este. Y en onCreateViewno hacer nada.

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

Cree un estilo personalizado en su archivo style.xml. Simplemente copie y pegue este código en su archivo style.xml

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

Luego, en el método createDialog de su DialogFragment, cree el objeto de diálogo por el código

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

Esto está funcionando para mí y espero que esto también te ayude


Tuve que agregar lo siguiente al estilo para que me funcionara: <item name = "android: windowMinWidthMajor"> 100% </item> <item name = "android: windowMinWidthMinor"> 100% </item>
Arnout

2

Así es como resolví cuando enfrenté este problema. Prueba esto.

en onActivityCreated de su DialogFragment, agregue este código de acuerdo con su necesidad ...

 @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

use esto en el método onCreateView de 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 es la altura del fragmento de diálogo, cámbielo como desee


1

en la raíz de su diseño, configure android: minWidth en un valor muy grande, por ejemplo

<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

Intenté varias respuestas enumeradas anteriormente; no funcionaron para mí. Esta es la solución a mi problema:

En DialogFragment(), agregue los códigos a continuación:

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)
        }
    }
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.