Eine Möglichkeit, die DialogFragmentBreite 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.
DialogFragmentmit 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.Dialogbeim 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>
DialogFragmentmit 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;
}
DialogFragmentmit AlertDialog, unter Verwendung von android:alertDialogThemeoder 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 Dialogscheinen s aufgrund ihres Titels einige Probleme mit der Breite zu haben (auch wenn Sie keine festlegen).
Wenn Sie keinen ThemeOverlay.AppCompat.DialogStil verwenden möchten und Dialogkeinen 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:windowMinWidthMinorund android:windowMinWidthMajordas Problem verursacht. Obwohl sie nicht in meinem Activityoder meinem Thema enthalten waren, wurden sie irgendwie Dialogimmer noch auf das ActivityThema 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 ContextThemeWrapperwerden soll, das als ContextDialogfeld 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:windowMinWidthMinorund android:windowMinWidthMajorin die ContextThemeWrappervon 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();
}