Google merekomendasikan agar kami menggunakan DialogFragment
alih-alih sederhana Dialog
dengan menggunakan Fragments API
, tetapi tidak masuk akal untuk menggunakan DialogFragment
kotak pesan konfirmasi Ya-Tidak yang sederhana. Apa praktik terbaik dalam kasus ini?
244
Dialog
atauAlertDialog.Builder::create()::show()
akan membuat dialog yang hilang saat Anda memutar layar.Jawaban:
Ya, gunakan
DialogFragment
dan dionCreateDialog
dalamnya Anda cukup menggunakan pembuat AlertDialog untuk membuat yang sederhanaAlertDialog
dengan tombol konfirmasi Ya / Tidak. Tidak terlalu banyak kode sama sekali.Berkenaan dengan menangani acara di fragmen Anda akan ada berbagai cara untuk melakukannya, tetapi saya hanya mendefinisikan pesan
Handler
di sayaFragment
, meneruskannyaDialogFragment
melalui konstruktornya dan kemudian mengirimkan pesan kembali ke penangan fragmen saya sebagai sesuai pada berbagai acara klik. Sekali lagi berbagai cara melakukan itu tetapi berikut ini berhasil untuk saya.Dalam dialog, tahan pesan dan instantiate di konstruktor:
Terapkan
onClickListener
dialog Anda dan kemudian panggil handler jika sesuai:Edit
Dan seperti
Message
paket Anda dapat menyimpannyaonSaveInstanceState
dan mengembalikannyaLalu masuk
onCreate
sumber
target
yang akan menjadi nol jika Anda memuatnya dari sebuah Bundel. Jika target Pesan adalah nol, dan Anda gunakansendToTarget
, Anda akan mendapatkan NullPointerException - bukan karena Pesan itu nol, tetapi karena targetnya adalah.Anda dapat membuat subkelas DialogFragment umum seperti YesNoDialog dan OkDialog, dan memasukkan judul dan pesan jika Anda sering menggunakan dialog di aplikasi Anda.
Kemudian panggil menggunakan yang berikut:
Dan menangani hasilnya
onActivityResult
.sumber
YES_NO_CALL
,getFragmentManager()
danonActivityResult
?YES_NO_CALL
adalah custom int yang merupakan kode permintaan.getFragmentManager()
mendapatkan manajer fragmen untuk aktivitas tersebut, danonActivityResult()
merupakan metode panggilan balik siklus fragmen.Gunakan DialogFragment melalui AlertDialog:
Sejak diperkenalkannya API level 13 :
yang showDialog metode dari Activity yang ditinggalkan . Meminta dialog di tempat lain dalam kode tidak disarankan karena Anda harus mengelola sendiri dialognya (mis. Perubahan orientasi).
Perbedaan DialogFragment - AlertDialog
Apakah mereka sangat berbeda? Dari referensi Android tentang DialogFragment :
Catatan lain
sumber
Saya akan merekomendasikan menggunakan
DialogFragment
.Tentu, membuat dialog "Ya / Tidak" dengannya cukup rumit mengingat bahwa itu seharusnya tugas yang agak sederhana, tetapi membuat kotak dialog serupa dengan
Dialog
mengejutkan juga rumit.(Siklus hidup aktivitas membuatnya rumit - Anda harus membiarkan
Activity
mengelola siklus hidup kotak dialog - dan tidak ada cara untuk melewati parameter khusus misalnya pesan khususActivity.showDialog
jika menggunakan tingkat API di bawah 8)Yang menyenangkan adalah bahwa Anda biasanya dapat membangun abstraksi sendiri
DialogFragment
dengan mudah.sumber
String
parameter. Ketika pengguna mengklik "Ya", misalnya, dialog akan memanggil metode Aktivitas dengan parameter "setuju". Parameter ini ditentukan saat menampilkan dialog, misalnya AskDialog.ask ("Apakah Anda setuju dengan persyaratan ini?", "Setuju", "tidak setuju");FragmentManager
'sfindFragmentByTag
. Tapi ya, itu membutuhkan sedikit kode yang adil.Fragment
this
dan memiliki AndaActivity
extends
AndaInterface
. Berhati-hati dalam melakukan threading, Anda bisa menghentikan panggilan antarmuka saat Anda tidak menginginkannya jika konkurensi Anda tidak terkendali. Tidak yakin apa yang dilakukan dengan memori dan spageti dependensi melingkar, apakah ada orang lain yang suka berpadu? Opsi lainnya adalahMessage
/Handler
tetapi Anda mungkin masih memiliki masalah konkurensi.AlertDialogFragment Generik dengan Pola Builder
Dalam proyek saya, saya sudah digunakan
AlertDialog.Builder
sudah banyak sebelum saya menemukan bahwa itu bermasalah. Namun, saya tidak ingin mengubah kode sebanyak itu di mana pun di aplikasi saya. Selain itu, saya sebenarnya penggemar lewatOnClickListeners
sebagai kelas anonim di mana mereka diperlukan (yaitu, ketika menggunakansetPositiveButton()
,setNegativeButton()
dll.) Daripada harus menerapkan ribuan metode panggilan balik untuk berkomunikasi antara fragmen dialog dan fragmen pemegang, yang dapat, dalam Pendapat saya, mengarah pada kode yang sangat membingungkan dan kompleks. Terutama, jika Anda memiliki beberapa dialog berbeda dalam satu fragmen dan kemudian perlu membedakan dalam implementasi panggilan balik antara dialog yang saat ini ditampilkan.Oleh karena itu, saya menggabungkan berbagai pendekatan untuk membuat
AlertDialogFragment
kelas pembantu umum yang dapat digunakan persis sepertiAlertDialog
:LARUTAN
( PERHATIKAN bahwa saya menggunakan ekspresi Java 8 lambda dalam kode saya, jadi Anda mungkin harus mengubah bagian-bagian kode jika Anda belum menggunakan ekspresi lambda .)
PEMAKAIAN
Saya memposting ini di sini bukan hanya untuk membagikan solusi saya, tetapi juga karena saya ingin meminta pendapat Anda kepada Anda: Apakah pendekatan ini sah atau bermasalah sampai batas tertentu?
sumber
Bolehkah saya menyarankan sedikit penyederhanaan jawaban @ ashishduh:
Ini menghilangkan kebutuhan pengguna (kelas) untuk terbiasa dengan internal komponen dan membuat penggunaannya sangat sederhana:
PS Dalam kasus saya, saya membutuhkan dialog peringatan sederhana sehingga itulah yang saya buat. Anda dapat menerapkan pendekatan ke Ya / Tidak atau jenis lain yang Anda butuhkan.
sumber
Gunakan Dialog untuk dialog ya atau tidak yang sederhana.
Ketika Anda membutuhkan tampilan yang lebih kompleks di mana Anda perlu mendapatkan siklus hidup seperti oncreate, meminta izin, setiap siklus hidup menimpa saya akan menggunakan fragmen dialog. Dengan demikian Anda memisahkan izin dan kode lain yang diperlukan dialog untuk beroperasi tanpa harus berkomunikasi dengan aktivitas panggilan.
sumber