Một cách để kiểm soát DialogFragmentchiề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.Dialogphong cách có trong Thư viện hỗ trợ Android.
DialogFragmentvớ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;
}
DialogFragmentvớ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.Dialoglà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>
DialogFragmentvớ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;
}
DialogFragmentvới AlertDialog, sử dụng android:alertDialogThemehoặ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, Dialogdườ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.Dialogkiểu và bạn Dialogkhô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:windowMinWidthMinorvà 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 Activityhoặc Dialog, chúng vẫn đang được áp dụng cho Activitychủ đề 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ủ đề ContextThemeWrappersẽ phục vụ như Contextcho 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:windowMinWidthMinorvà android:windowMinWidthMajorvà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();
}