Один із способів контролю за DialogFragment
шириною та висотою вашого продукту - переконатися, що його діалог дотримується ширини та висоти вашого перегляду, якщо їх значення WRAP_CONTENT
.
Використання ThemeOverlay.AppCompat.Dialog
Один простий спосіб досягти цього - скористатися ThemeOverlay.AppCompat.Dialog
стилем, включеним у бібліотеку підтримки Android.
DialogFragment
з 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
з AlertDialog
(застереження:) 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();
}
Ви також можете встановити ThemeOverlay.AppCompat.Dialog
тему за замовчуванням під час створення діалогів, додавши її в тему xml програми.
Будьте уважні, оскільки для багатьох діалогів потрібна мінімальна ширина за замовчуванням, щоб добре виглядати.
<!-- 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
з Dialog
використанням 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
з AlertDialog
, використовуючи android:alertDialogTheme
або alertDialogTheme
(застереження:) 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();
}
Бонус
У старих Android API, Dialog
схоже, є проблеми із шириною через їх назву (навіть якщо ви її не встановили).
Якщо ви не хочете використовувати ThemeOverlay.AppCompat.Dialog
стиль, і вам 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());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(view);
return dialog;
}
Застаріла відповідь у більшості випадків не спрацює
Я намагався зробити так, щоб діалогове вікно відповідало ширині та висоті моєї верстки, не задаючи фіксованого розміру програмно.
Я зрозумів, що це android:windowMinWidthMinor
і android:windowMinWidthMajor
викликає проблему. Незважаючи на те, що вони не були включені до теми моєї Activity
або Dialog
, вони все ще Activity
якось застосовувались до цієї теми.
Я придумав три можливі рішення.
Рішення 1: створіть власну тему діалогу та використовуйте її під час створення діалогового вікна в 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);
}
Рішення 2: створити власну тему, яка буде використовуватися в діалоговому вікні, ContextThemeWrapper
який буде служити Context
діалогу. Використовуйте це, якщо ви не хочете створювати власну тему діалогу (наприклад, коли ви хочете використовувати тему, визначену 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());
}
Рішення 3 (з AlertDialog
): виконання android:windowMinWidthMinor
і android:windowMinWidthMajor
в ContextThemeWrapper
створеному з допомогою 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();
}