控制你的DialogFragment的宽度和高度的一种方法是确保它的对话框尊重你的视图的宽度和高度,如果它们的值是WRAP_CONTENT。
使用ThemeOverlay.AppCompat.Dialog
实现这一点的一个简单方法是使用Android支持库中包含的themeoverlay . appcompatc . dialog样式。
使用Dialog的DialogFragment:
@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;
}
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>
使用Dialog的DialogFragment,使用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;
}
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上,对话框似乎有一些宽度问题,因为它们的标题(即使你没有设置一个)。
如果你不想使用themeoverlay . appcompata .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导致了这个问题。即使它们没有包含在我的活动或对话的主题中,它们仍然以某种方式应用到活动主题中。
我想到了三个可能的解决方案。
解决方案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的自定义主题,该主题将作为对话框的上下文。如果你不想创建一个自定义对话框主题(例如,当你想使用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();
}