Une façon de contrôler votre DialogFragment
largeur 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.Dialog
style inclus dans la bibliothèque de support Android.
DialogFragment
avec 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;
}
DialogFragment
avec 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.Dialog
comme 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>
DialogFragment
avec 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;
}
DialogFragment
avec AlertDialog
, en utilisant android:alertDialogTheme
ou 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 Dialog
s 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.Dialog
style et que vous Dialog
n'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:windowMinWidthMinor
et android:windowMinWidthMajor
causais le problème. Même s'ils n'étaient pas inclus dans le thème de mon Activity
ou Dialog
, ils étaient toujours appliqués au Activity
thè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 ContextThemeWrapper
qui servira de Context
dialogue. 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:windowMinWidthMinor
et android:windowMinWidthMajor
entrer dans le ContextThemeWrapper
créé 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();
}