Một cách để kiểm soát DialogFragment
chiều rộng và chiều cao của bạn là đảm bảo hộp thoại của nó tôn trọng chiều rộng và chiều cao của chế độ xem của bạn nếu giá trị của chúng làWRAP_CONTENT
.
Sử dụng ThemeOverlay.AppCompat.Dialog
Một cách đơn giản để đạt được điều này là sử dụng ThemeOverlay.AppCompat.Dialog
phong cách có trong Thư viện hỗ trợ Android.
DialogFragment
với 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
với AlertDialog
(báo trước 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();
}
Bạn cũng có thể đặt ThemeOverlay.AppCompat.Dialog
làm chủ đề mặc định khi tạo các hộp thoại của mình, bằng cách thêm nó vào chủ đề xml của ứng dụng.
Hãy cẩn thận, vì nhiều hộp thoại cần chiều rộng tối thiểu mặc định để trông tốt.
<!-- 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
với Dialog
, sử dụng 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
với AlertDialog
, sử dụng android:alertDialogTheme
hoặc alertDialogTheme
(báo trước 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();
}
Tặng kem
Trên các API Android cũ hơn, Dialog
dường như có một số vấn đề về chiều rộng, do tiêu đề của chúng (ngay cả khi bạn không đặt).
Nếu bạn không muốn sử dụng ThemeOverlay.AppCompat.Dialog
kiểu và bạn Dialog
không cần một tiêu đề (hoặc có một tùy chỉnh), bạn có thể muốn tắt nó:
@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;
}
Câu trả lời lỗi thời, sẽ không hoạt động trong hầu hết các trường hợp
Tôi đã cố gắng làm cho hộp thoại tôn trọng chiều rộng và chiều cao của bố cục của tôi, mà không chỉ định kích thước cố định theo chương trình.
Tôi đã tìm ra điều đó android:windowMinWidthMinor
và android:windowMinWidthMajor
đang gây ra vấn đề. Mặc dù chúng không được bao gồm trong chủ đề của tôi Activity
hoặc Dialog
, chúng vẫn đang được áp dụng cho Activity
chủ đề này, bằng cách nào đó.
Tôi đã đưa ra ba giải pháp có thể.
Giải pháp 1: tạo chủ đề hộp thoại tùy chỉnh và sử dụng nó khi tạo hộp thoại trong 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);
}
Giải pháp 2: tạo một chủ đề tùy chỉnh sẽ được sử dụng trong một chủ đề ContextThemeWrapper
sẽ phục vụ như Context
cho hộp thoại. Sử dụng điều này nếu bạn không muốn tạo một chủ đề hộp thoại tùy chỉnh (ví dụ: khi bạn muốn sử dụng chủ đề được chỉ định bởi 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());
}
Giải pháp 3 (với một AlertDialog
): thực thi android:windowMinWidthMinor
và android:windowMinWidthMajor
vào ContextThemeWrapper
được tạo bởi 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();
}