Saya menentukan tata letak DialogFragment saya dalam file tata letak xml (sebut saja layout_mydialogfragment.xml
), layout_width
dan layout_height
atributnya dan khususnya ( 100dp
masing - masing katakanlah). Saya kemudian mengembang tata letak ini dalam onCreateView(...)
metode DialogFragment saya sebagai berikut:
View view = inflater.inflate(R.layout.layout_mydialogfragment, container, false);
Sayangnya, saya menemukan bahwa ketika dialog saya (DialogFragment) muncul, itu tidak menghormati layout_width
dan layout_height
ditentukan dalam file layout xml-nya (dan dialog saya menyusut atau meluas bervariasi tergantung pada konten). Ada yang tahu apakah atau bagaimana saya bisa mendapatkan dialog saya untuk menghormati layout_width
dan layout_height
ditentukan dalam file layout xml-nya? Saat ini saya harus menentukan lagi lebar dan tinggi dialog saya dalam onResume()
metode DialogFragment saya sebagai berikut ...
getDialog().getWindow().setLayout(width, height);
... Dan dengan demikian, tidak dapat disangkal, harus ingat untuk membuat perubahan di masa depan dengan lebar dan tinggi dialog di dua tempat.
sumber
Jawaban:
Jika Anda mengonversi langsung dari nilai sumber daya:
Kemudian tentukan match_parent di tata letak Anda untuk dialog:
Anda hanya perlu khawatir tentang satu tempat (letakkan di tempat Anda
DialogFragment#onResume
). Ini tidak sempurna, tetapi setidaknya berfungsi untuk memiliki RelativeLayout sebagai root dari file layout dialog Anda.sumber
RelativeLayout
dan itu membantu saya. Terima kasih banyak atas solusinya - ini menyelamatkan saya banyak waktu.onResume()
, bukanonCreateView()
. (Layout root saya adalah RelativeLayout terbungkus dalam ScrollView.)int width = getResources().getDisplayMetrics().widthPixels
onCreateDialog()
. Kebutuhan untuk berada dionResume()
.Saya akhirnya mengesampingkan
Fragment.onResume()
dan meraih atribut dari dialog yang mendasarinya, kemudian mengatur lebar / tinggi params di sana. Saya mengatur tinggi / lebar tata letak terluar kematch_parent
. Perhatikan bahwa kode ini tampaknya juga menghargai margin yang saya tetapkan dalam tata letak xml.sumber
(android.view.WindowManager.LayoutParams)
, dari mana Anda casting? Saya bingung ketika memilih impor yang benar untukLayoutParams
tampil di 3 baris pertama fungsi. Akhirnya memilih(android.view.WindowManager.LayoutParams)
. Apakah ini benar?android.view.WindowManager.LayoutParams
, tidak ada gunanya menggunakanViewGroup.LayoutParams
tiga baris di atas ... Anda tidak mendapatkan fleksibilitas di sini. Terserah, terima kasih atas jawaban yang bagus ini!Saya mendapatkan DialogFragment ukuran tetap dengan mendefinisikan yang berikut ini dalam tata letak utama XML (LinearLayout dalam kasus saya):
sumber
Satu-satunya hal yang berhasil dalam kasus saya adalah solusi yang ditunjukkan di sini: http://adilatwork.blogspot.mx/2012/11/android-dialogfragment-dialog-sizing.html
Cuplikan dari posting blog Adil:
sumber
getDialog().getWindow().setLayout(dialogWidth, dialogHeight);
berfungsi dengan baik untuk DialogFragment. Tapi saya tidak mengerti pemeriksaan keamanannya. mengapa kita harus memeriksanull
?Dialog
(anak dariDialogFragment
) akan tersedia pada saat diminta. Mungkin saja Android akan mengembalikan nol saat kami menelepongetDialog()
.Salah satu cara untuk mengontrol
DialogFragment
lebar dan tinggi Anda adalah dengan memastikan dialognya menghormati lebar dan tinggi tampilan Anda jika nilainyaWRAP_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
denganDialog
:DialogFragment
denganAlertDialog
(peringatan:)minHeight="48dp"
: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.
DialogFragment
denganDialog
, memanfaatkanandroid:dialogTheme
:DialogFragment
denganAlertDialog
, memanfaatkanandroid:alertDialogTheme
ataualertDialogTheme
(peringatan:)minHeight="48dp"
: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 AndaDialog
tidak perlu judul (atau memiliki judul khusus), Anda mungkin ingin menonaktifkannya: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
danandroid:windowMinWidthMajor
menyebabkan masalah. Meskipun mereka tidak termasuk dalam tema sayaActivity
atauDialog
, mereka masih diterapkan padaActivity
tema, entah bagaimana.Saya datang dengan tiga solusi yang memungkinkan.
Solusi 1: buat tema dialog khusus dan gunakan saat membuat dialog di menu
DialogFragment
.Solusi 2: buat tema khusus untuk digunakan dalam dialog
ContextThemeWrapper
yang akan berfungsiContext
. Gunakan ini jika Anda tidak ingin membuat tema dialog khusus (misalnya, saat Anda ingin menggunakan tema yang ditentukan olehandroid:dialogTheme
).Solusi 3 (dengan an
AlertDialog
): menegakkanandroid:windowMinWidthMinor
danandroid:windowMinWidthMajor
ke dalamContextThemeWrapper
diciptakan olehAlertDialog$Builder
.sumber
Theme.MaterialComponents.Light.Dialog
sebagai orang tua dan menggunakan gaya ini di konstruktorMaterialAlertDialogBuilder
. Menemukan jawaban Anda setelah penelitian 1 jam. Terima kasih dan acungan jempol.Gotcha # 13:
DialogFragment
Tata LetakPikiran semacam itu benar-benar mati rasa.
Saat membuat
DialogFragment
, Anda dapat memilih untuk menggantionCreateView
(yang meneruskan aViewGroup
untuk melampirkan tata letak .xml Anda) atauonCreateDialog
, yang tidak.Pilihan apakah akan menimpa
OnCreateDialog
atauOnCreateView
tergantung pada bagaimana Anda ingin menggunakan dialog.OnCreateDialog
.OnCreateView
.Ini mungkin hal terburuk di dunia.
onCreateDialog
Penyakit jiwaJadi, Anda override
onCreateDialog
di AndaDialogFragment
untuk membuat sebuah instance disesuaikanAlertDialog
untuk tampilan dalam jendela. Keren. Tapi ingat,onCreateDialog
tidak menerimaViewGroup
untuk melampirkan kustom Anda xml tata letak untuk . Tidak masalah, Anda cukup meneruskannull
keinflate
metode.Biarkan kegilaan dimulai.
Saat Anda mengganti
onCreateDialog
, Android SEPENUHNYA MENGUMPULKAN beberapa atribut dari simpul akar Tata Letak .xml yang Anda kembangkan. Ini termasuk, tetapi mungkin tidak terbatas pada:background_color
layout_gravity
layout_width
layout_height
Hanya kata yang
DialogFragment
membuatku ingin muntah. Saya bisa menulis novel yang diisi dengan Android gotcha dan snafus, tetapi yang ini adalah salah satu yang paling dalam.Untuk kembali ke kewarasan, pertama, kami menyatakan gaya untuk memulihkan HANYA
background_color
danlayout_gravity
kami berharap:Gaya di atas mewarisi dari tema dasar untuk Dialog (dalam
AppCompat
tema dalam contoh ini).Selanjutnya, kami menerapkan gaya pemrograman untuk mengembalikan nilai-nilai yang hanya dibuang Android dan mengembalikan
AlertDialog
tampilan dan nuansa standar :Kode di atas akan membuat Anda
AlertDialog
terlihat sepertiAlertDialog
lagi. Mungkin ini cukup baik.Tapi tunggu, masih ada lagi!
Jika Anda ingin menetapkan SPESIFIK
layout_width
ataulayout_height
untuk AndaAlertDialog
ketika itu ditampilkan (sangat mungkin), maka coba tebak, Anda belum selesai!Keributan berlanjut ketika Anda menyadari bahwa jika Anda mencoba untuk menetapkan gaya tertentu
layout_width
ataulayout_height
gaya baru Anda, Android akan sepenuhnya mengabaikan itu juga !:Untuk menetapkan lebar atau tinggi jendela KHUSUS, Anda dapat melanjutkan ke metode penggila keseluruhan dan berurusan dengan
LayoutParams
:Singkatnya
Untuk
DialogFragment
s yang menimpaonCreateDialog
:AlertDialog
tampilan dan nuansa standar , buat gaya yang menetapkanbackground_color
=transparent
danlayout_gravity
=center
dan terapkan gaya itu dalamonCreateDialog
.layout_width
dan / ataulayout_height
, melakukannya pemrograman dionResume
denganLayoutParams
sumber
Ketika saya perlu membuat DialogFragment sedikit lebih lebar, saya menetapkan minWidth:
sumber
Saya tidak melihat alasan kuat untuk menimpa
onResume
atauonStart
untuk mengatur lebar dan tinggi dariWindow
dalamDialogFragment
'sDialog
- metode ini siklus hidup tertentu dapat dipanggil berulang-ulang dan tidak perlu mengeksekusi yang mengubah ukuran kode lebih dari sekali karena hal-hal seperti multi window switching, pelatarbelakangan lalu foregrounding aplikasi, dan sebagainya. Konsekuensi dari pengulangan itu cukup sepele, tetapi mengapa puas dengan itu?Mengatur lebar / tinggi sebagai gantinya dalam
onActivityCreated()
metode yang ditimpa akan menjadi perbaikan karena metode ini secara realistis hanya dipanggil sekali per instance dari AndaDialogFragment
. Sebagai contoh:Di atas saya hanya mengatur lebarnya
match_parent
terlepas dari orientasi perangkat. Jika Anda ingin dialog lanskap Anda tidak terlalu lebar, Anda dapat melakukan pengecekan apakahgetResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT
sebelumnya.sumber
Dimensi dalam tata letak terluar tidak berfungsi dalam dialog. Anda dapat menambahkan tata letak tempat mengatur dimensi di bawah terluar.
sumber
Saya memperbaikinya mengatur parameter tata letak elemen root.
sumber
Inilah cara untuk mengatur lebar / tinggi DialogFragment dalam xml. Hanya membungkus viewHierarchy Anda dalam Framelayout (tata letak apa pun akan berfungsi) dengan latar belakang transparan.
Latar belakang transparan tampaknya menjadi bendera khusus, karena secara otomatis memusatkan anak frameLayout di jendela ketika Anda melakukannya. Anda masih akan mendapatkan layar penuh gelap di belakang fragmen Anda, menunjukkan fragmen Anda adalah elemen aktif.
sumber
Ini adalah versi kotlin
sumber
Anda dapat menggunakan persentase untuk lebar.
Saya menggunakan Holo Theme untuk contoh ini.
sumber
Anda dapat di bawah kode untuk mengatur lebar dan tinggi tata letak dari java.
sumber
Saya membuat dialog menggunakan AlertDialog.Builder jadi saya menggunakan jawaban Rodrigo di dalam OnShowListener.
sumber
Snicolas
dalam diskusi "DialogFragment
vsAlertDialog
" di stackoverflow.com/a/7979823/3372061 .Bekerja pada Android 6.0, mengalami masalah yang sama.
AlertDialog
akan default kewidth
set standar dalam tema terlepas dariwidth
set sebenarnya di root tampilan kustomLayout
. Saya bisa mendapatkannya untuk mengatur benar menyesuaikanwidth
dariloading_message
TextView
. Tanpa menyelidiki lebih lanjut, tampaknya bahwa ukuran elemen yang sebenarnya danLayout
membungkus root di sekitar mereka membuatnya berfungsi seperti yang diharapkan. Di bawah ini adalah tata letak XML dari dialog pemuatan yang mengaturwidth
dialog dengan benar. Menggunakan perpustakaan ini untuk animasi.sumber
Mudah dan kokoh:
sumber
Dalam kasus saya
DialogFragment
ditempati ukuran aktivitas penuh seperti aFragment
. ItuDialogFragment
didasarkan pada tata letak XML, bukanAlertDialog
. Kesalahan saya adalah menambahkan fragmen dialogFragmentManager
sebagai fragmen biasa:Alih-alih, saya perlu
show
fragmen dialog:Setelah beberapa pengeditan (saya miliki
ViewPager2
dalam tata letak) fragmen dialog menjadi terlalu sempit:Saya menggunakan solusi N1hk :
Sekarang telah ditentukan lebar dan tinggi, bukan ukuran aktivitas penuh.
Saya ingin katakan tentang
onCreateView
danonCreateDialog
. Jika Anda memiliki fragmen dialog berdasarkan tata letak, Anda dapat menggunakan salah satu dari 2 metode ini.1) Jika Anda menggunakan
onCreateView
, maka Anda harus menggunakanonActivityCreated
untuk mengatur lebar.2) Jika Anda menggunakan
onCreateDialog
alih-alihonCreateView
, Anda dapat mengatur parameter di sana.onActivityCreated
tidak akan dibutuhkan.sumber
Dalam kasus saya itu disebabkan oleh
align_parentBottom="true"
diberikan ke tampilan di dalam aRelativeLayout
. Menghapus semua alignParentBottom dan mengubah semua layout menjadi LinearLayouts vertikal dan masalah hilang.sumber
Atur tata letak Induk dari tata letak dialog Kustom ke RelativeLayout , dapatkan lebar dan tinggi umum secara otomatis.
sumber
Salah satu solusi sebelumnya hampir berhasil. Saya mencoba sesuatu yang sedikit berbeda dan akhirnya berhasil untuk saya.
(Pastikan Anda melihat solusinya) Ini adalah solusinya .. Klik Di Sini Ini berfungsi kecuali untuk: builder.getContext (). GetTheme (). ApplyStyle (R.style.Theme_Window_NoMinWidth, true);
Saya mengubahnya menjadi
Baris terakhir adalah apa yang benar-benar berbeda.
sumber
sumber
Ini adalah solusi paling sederhana
Solusi terbaik yang saya temukan adalah menimpa
onCreateDialog()
alih-alihonCreateView()
. setContentView () akan mengatur dimensi jendela yang benar sebelum menggembung. Ini menghilangkan kebutuhan untuk menyimpan / mengatur dimensi, warna latar belakang, gaya, dll dalam file sumber daya dan mengaturnya secara manual.sumber
Tambahkan ke Anda
FragmentDialog
:sumber
Ini akan bekerja dengan sempurna.
sumber
Untuk mendapatkan Dialog yang mencakup hampir seluruh scree: Pertama tentukan kelas ScreenParameter
Maka Anda harus memanggil ScreenParamater sebelum metode getDialog.getWindow (). SetLayout () Anda
sumber