Salah satu cara untuk mengontrol DialogFragment
lebar 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.Dialog
gaya yang termasuk dalam Perpustakaan Dukungan Android.
DialogFragment
dengan 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
dengan 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.Dialog
sebagai 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>
DialogFragment
dengan 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;
}
DialogFragment
dengan AlertDialog
, memanfaatkan android:alertDialogTheme
atau 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, Dialog
tampaknya memiliki beberapa masalah lebar, karena judulnya (bahkan jika Anda tidak menyetelnya).
Jika Anda tidak ingin menggunakan ThemeOverlay.AppCompat.Dialog
gaya dan Anda Dialog
tidak 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:windowMinWidthMinor
dan android:windowMinWidthMajor
menyebabkan masalah. Meskipun mereka tidak termasuk dalam tema saya Activity
atau Dialog
, mereka masih diterapkan pada Activity
tema, 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 ContextThemeWrapper
yang 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:windowMinWidthMinor
dan android:windowMinWidthMajor
ke dalam ContextThemeWrapper
diciptakan 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();
}