Один из способов контролировать 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();
}