Eine Möglichkeit, die DialogFragment
Breite und Höhe Ihrer Ansicht zu steuern , besteht darin, sicherzustellen, dass der Dialog die Breite und Höhe Ihrer Ansicht berücksichtigt, wenn deren Wert gleich ist WRAP_CONTENT
.
Verwenden von ThemeOverlay.AppCompat.Dialog
Eine einfache Möglichkeit, dies zu erreichen, besteht darin ThemeOverlay.AppCompat.Dialog
, den in der Android Support Library enthaltenen Stil zu verwenden.
DialogFragment
mit 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
mit AlertDialog
(Einschränkung :) 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();
}
Sie können ThemeOverlay.AppCompat.Dialog
beim Erstellen Ihrer Dialoge auch das Standarddesign festlegen , indem Sie es dem XML-Design Ihrer App hinzufügen.
Seien Sie vorsichtig, da viele Dialoge die Standard-Mindestbreite benötigen, um gut auszusehen.
<!-- 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
mit Dialog
, Gebrauch machen vonandroid: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
mit AlertDialog
, unter Verwendung von android:alertDialogTheme
oder alertDialogTheme
(Vorbehalt: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();
}
Bonus
Bei älteren Android-APIs Dialog
scheinen s aufgrund ihres Titels einige Probleme mit der Breite zu haben (auch wenn Sie keine festlegen).
Wenn Sie keinen ThemeOverlay.AppCompat.Dialog
Stil verwenden möchten und Dialog
keinen Titel benötigen (oder einen benutzerdefinierten haben), möchten Sie ihn möglicherweise deaktivieren:
@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;
}
Veraltete Antwort funktioniert in den meisten Fällen nicht
Ich habe versucht, den Dialog so zu gestalten, dass er die Breite und Höhe meines Layouts berücksichtigt, ohne programmgesteuert eine feste Größe anzugeben.
Ich habe das herausgefunden android:windowMinWidthMinor
und android:windowMinWidthMajor
das Problem verursacht. Obwohl sie nicht in meinem Activity
oder meinem Thema enthalten waren, wurden sie irgendwie Dialog
immer noch auf das Activity
Thema angewendet .
Ich habe drei mögliche Lösungen gefunden.
Lösung 1: Erstellen Sie ein benutzerdefiniertes Dialogthema und verwenden Sie es beim Erstellen des Dialogfelds in der 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);
}
Lösung 2: Erstellen Sie ein benutzerdefiniertes Thema, das in einem verwendet ContextThemeWrapper
werden soll, das als Context
Dialogfeld dient. Verwenden Sie diese Option, wenn Sie kein benutzerdefiniertes Dialogthema erstellen möchten (z. B. wenn Sie das durch angegebene Thema verwenden möchten 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());
}
Lösung 3 (mit einem AlertDialog
): erzwingen android:windowMinWidthMinor
und android:windowMinWidthMajor
in die ContextThemeWrapper
von der 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();
}