Une façon de contrôler votre DialogFragmentlargeur et hauteur est de vous assurer que sa boîte de dialogue respecte la largeur et la hauteur de votre vue si leur valeur est WRAP_CONTENT.
En utilisant ThemeOverlay.AppCompat.Dialog
Un moyen simple d'y parvenir consiste à utiliser le ThemeOverlay.AppCompat.Dialogstyle inclus dans la bibliothèque de support Android.
DialogFragmentavec 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;
}
DialogFragmentavec AlertDialog(mise en garde:) 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();
}
Vous pouvez également définir ThemeOverlay.AppCompat.Dialogcomme thème par défaut lors de la création de vos boîtes de dialogue, en l'ajoutant au thème xml de votre application.
Faites attention, car de nombreuses boîtes de dialogue ont besoin de la largeur minimale par défaut pour bien paraître.
<!-- 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>
DialogFragmentavec Dialog, en utilisant 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;
}
DialogFragmentavec AlertDialog, en utilisant android:alertDialogThemeou alertDialogTheme(mise en garde:) 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();
}
Prime
Sur les API Android plus anciennes, les Dialogs semblent avoir des problèmes de largeur, en raison de leur titre (même si vous n'en définissez pas).
Si vous ne souhaitez pas utiliser de ThemeOverlay.AppCompat.Dialogstyle et que vous Dialogn'avez pas besoin d'un titre (ou en a un personnalisé), vous pouvez le désactiver:
@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;
}
Réponse obsolète, ne fonctionnera pas dans la plupart des cas
J'essayais de faire en sorte que le dialogue respecte la largeur et la hauteur de ma mise en page, sans spécifier de taille fixe par programmation.
Je l'ai compris android:windowMinWidthMinoret android:windowMinWidthMajorcausais le problème. Même s'ils n'étaient pas inclus dans le thème de mon Activityou Dialog, ils étaient toujours appliqués au Activitythème, d'une manière ou d'une autre.
J'ai proposé trois solutions possibles.
Solution 1: créez un thème de boîte de dialogue personnalisé et utilisez-le lors de la création de la boîte de dialogue dans le 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);
}
Solution 2: créez un thème personnalisé à utiliser dans un ContextThemeWrapperqui servira de Contextdialogue. Utilisez cette option si vous ne souhaitez pas créer de thème de dialogue personnalisé (par exemple, lorsque vous souhaitez utiliser le thème spécifié par 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());
}
Solution 3 (avec un AlertDialog): appliquer android:windowMinWidthMinoret android:windowMinWidthMajorentrer dans le ContextThemeWrappercréé par le 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();
}