Una forma de controlar el DialogFragmentancho y el alto de su es asegurarse de que su diálogo respete el ancho y alto de su vista si su valor es WRAP_CONTENT.
Utilizando ThemeOverlay.AppCompat.Dialog
Una forma sencilla de lograr esto es hacer uso del ThemeOverlay.AppCompat.Dialogestilo que se incluye en la Biblioteca de soporte de Android.
DialogFragmentcon Dialog:
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(getContext());
View view = inflater.inflate(R.layout.dialog_view, null);
Dialog dialog = new Dialog(getContext(), R.style.ThemeOverlay_AppCompat_Dialog);
dialog.setContentView(view);
return dialog;
}
DialogFragmentcon AlertDialog(advertencia:) minHeight="48dp":
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(getContext());
View view = inflater.inflate(R.layout.dialog_view, null);
AlertDialog.Builder builder = new AlertDialog.Builder(getContext(), R.style.ThemeOverlay_AppCompat_Dialog);
builder.setView(view);
return builder.create();
}
También puede establecer ThemeOverlay.AppCompat.Dialogcomo tema predeterminado al crear sus cuadros de diálogo, agregándolo al tema xml de su aplicación.
Tenga cuidado, ya que muchos cuadros de diálogo necesitan el ancho mínimo predeterminado para verse bien.
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- For Android Dialog. -->
<item name="android:dialogTheme">@style/ThemeOverlay.AppCompat.Dialog</item>
<!-- For Android AlertDialog. -->
<item name="android:alertDialogTheme">@style/ThemeOverlay.AppCompat.Dialog</item>
<!-- For AppCompat AlertDialog. -->
<item name="alertDialogTheme">@style/ThemeOverlay.AppCompat.Dialog</item>
<!-- Other attributes. -->
</style>
DialogFragmentcon Dialog, haciendo uso de android:dialogTheme:
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(getContext());
View view = inflater.inflate(R.layout.dialog_view, null);
Dialog dialog = new Dialog(getContext());
dialog.setContentView(view);
return dialog;
}
DialogFragmentcon AlertDialog, haciendo uso de android:alertDialogThemeo alertDialogTheme(advertencia:) minHeight="48dp":
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(getContext());
View view = inflater.inflate(R.layout.dialog_view, null);
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setView(view);
return builder.create();
}
Prima
En las API de Android anteriores, los Dialogs parecen tener algunos problemas de ancho debido a su título (incluso si no configura uno).
Si no desea utilizar el ThemeOverlay.AppCompat.Dialogestilo y Dialogno necesita un título (o tiene uno personalizado), puede deshabilitarlo:
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(getContext());
View view = inflater.inflate(R.layout.dialog_view, null);
Dialog dialog = new Dialog(getContext());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(view);
return dialog;
}
Respuesta desactualizada, no funcionará en la mayoría de los casos
Estaba tratando de hacer que el diálogo respetara el ancho y la altura de mi diseño, sin especificar un tamaño fijo programáticamente.
Me di cuenta de eso android:windowMinWidthMinory android:windowMinWidthMajorestaba causando el problema. Aunque no se incluyeron en el tema de mi Activityo Dialog, todavía se aplicaban al Activitytema, de alguna manera.
Se me ocurrieron tres posibles soluciones.
Solución 1: cree un tema de diálogo personalizado y úselo cuando cree el diálogo en DialogFragment.
<style name="Theme.Material.Light.Dialog.NoMinWidth" parent="android:Theme.Material.Light.Dialog">
<item name="android:windowMinWidthMinor">0dip</item>
<item name="android:windowMinWidthMajor">0dip</item>
</style>
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new Dialog(getActivity(), R.style.Theme_Material_Light_Dialog_NoMinWidth);
}
Solución 2: cree un tema personalizado para utilizarlo en uno ContextThemeWrapperque sirva como Contextdiálogo. Use esto si no desea crear un tema de diálogo personalizado (por ejemplo, cuando desea usar el tema especificado por android:dialogTheme).
<style name="Theme.Window.NoMinWidth" parent="">
<item name="android:windowMinWidthMinor">0dip</item>
<item name="android:windowMinWidthMajor">0dip</item>
</style>
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new Dialog(new ContextThemeWrapper(getActivity(), R.style.Theme_Window_NoMinWidth), getTheme());
}
Solución 3 (con un AlertDialog): hacer cumplir android:windowMinWidthMinory android:windowMinWidthMajoren lo ContextThemeWrappercreado por el AlertDialog$Builder.
<style name="Theme.Window.NoMinWidth" parent="">
<item name="android:windowMinWidthMinor">0dip</item>
<item name="android:windowMinWidthMajor">0dip</item>
</style>
@Override
public final Dialog onCreateDialog(Bundle savedInstanceState) {
View view = new View(); // Inflate your view here.
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(view);
// Make sure the dialog width works as WRAP_CONTENT.
builder.getContext().getTheme().applyStyle(R.style.Theme_Window_NoMinWidth, true);
return builder.create();
}