Salah satu cara untuk mengontrol DialogFragmentlebar dan tinggi Anda adalah dengan memastikan dialognya menghormati lebar dan tinggi tampilan Anda jika nilainya WRAP_CONTENT.
Menggunakan ThemeOverlay.AppCompat.Dialog
Salah satu cara sederhana untuk mencapai ini adalah dengan menggunakan ThemeOverlay.AppCompat.Dialoggaya yang termasuk dalam Perpustakaan Dukungan Android.
DialogFragmentdengan 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;
}
DialogFragmentdengan AlertDialog(peringatan:) 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();
}
Anda juga dapat menetapkan ThemeOverlay.AppCompat.Dialogsebagai tema default saat membuat dialog, dengan menambahkannya ke tema xml aplikasi Anda.
Hati-hati, karena banyak dialog membutuhkan lebar minimum default agar terlihat bagus.
<!-- 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>
DialogFragmentdengan Dialog, memanfaatkan 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;
}
DialogFragmentdengan AlertDialog, memanfaatkan android:alertDialogThemeatau alertDialogTheme(peringatan:) 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();
}
Bonus
Pada API Android Lama, Dialogtampaknya memiliki beberapa masalah lebar, karena judulnya (bahkan jika Anda tidak menyetelnya).
Jika Anda tidak ingin menggunakan ThemeOverlay.AppCompat.Dialoggaya dan Anda Dialogtidak perlu judul (atau memiliki judul khusus), Anda mungkin ingin menonaktifkannya:
@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;
}
Jawaban usang, tidak akan berfungsi dalam kebanyakan kasus
Saya mencoba untuk membuat dialog menghormati lebar dan tinggi tata letak saya, tanpa menentukan ukuran tetap secara pemrograman.
Saya tahu itu android:windowMinWidthMinordan android:windowMinWidthMajormenyebabkan masalah. Meskipun mereka tidak termasuk dalam tema saya Activityatau Dialog, mereka masih diterapkan pada Activitytema, entah bagaimana.
Saya datang dengan tiga solusi yang memungkinkan.
Solusi 1: buat tema dialog khusus dan gunakan saat membuat dialog di menu 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);
}
Solusi 2: buat tema khusus untuk digunakan dalam dialog ContextThemeWrapperyang akan berfungsi Context. Gunakan ini jika Anda tidak ingin membuat tema dialog khusus (misalnya, saat Anda ingin menggunakan tema yang ditentukan oleh 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());
}
Solusi 3 (dengan an AlertDialog): menegakkan android:windowMinWidthMinordan android:windowMinWidthMajorke dalam ContextThemeWrapperdiciptakan oleh 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();
}