DialogFragment
adalah
subclass fragmen khusus yang dirancang untuk membuat dan menghosting
dialog. Meskipun Anda tidak perlu
menghosting dialog dalam fragmen, sehingga memungkinkan
FragmentManager
mengelola status
dialog, dan otomatis memulihkan dialog saat konfigurasi
terjadi perubahan.
Membuat DialogFragment
Untuk membuat DialogFragment
, buat class yang memperluas
DialogFragment
dan
abaikan
onCreateDialog()
,
seperti yang ditunjukkan dalam contoh berikut.
Kotlin
class PurchaseConfirmationDialogFragment : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = AlertDialog.Builder(requireContext()) .setMessage(getString(R.string.order_confirmation)) .setPositiveButton(getString(R.string.ok)) { _,_ -> } .create() companion object { const val TAG = "PurchaseConfirmationDialog" } }
Java
public class PurchaseConfirmationDialogFragment extends DialogFragment { @NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { return new AlertDialog.Builder(requireContext()) .setMessage(getString(R.string.order_confirmation)) .setPositiveButton(getString(R.string.ok), (dialog, which) -> {} ) .create(); } public static String TAG = "PurchaseConfirmationDialog"; }
Serupa dengan bagaimana
onCreateView()
membuat root View
dalam fragmen biasa, onCreateDialog()
membuat Dialog
untuk ditampilkan
sebagai bagian dari DialogFragment
. Tuas DialogFragment
yang menampilkan
Dialog
pada status yang sesuai dalam siklus proses fragmen.
Seperti halnya onCreateView()
, Anda dapat menampilkan subclass mana pun dari Dialog
dari onCreateDialog()
dan tidak terbatas pada
AlertDialog
.
Menampilkan DialogFragment
Anda tidak perlu membuat FragmentTransaction
secara manual untuk
menampilkan DialogFragment
Anda. Sebagai gantinya, gunakan metode show()
untuk
menampilkan dialog Anda. Anda dapat meneruskan referensi ke FragmentManager
dan String
untuk digunakan sebagai tag FragmentTransaction
.
Saat membuat
DialogFragment
dari dalam Fragment
, gunakan elemen
turunan FragmentManager
sehingga status dipulihkan dengan benar
setelah perubahan konfigurasi. Tag non-null memungkinkan Anda menggunakan
findFragmentByTag()
untuk mengambil DialogFragment
di lain waktu.
Kotlin
// From another Fragment or Activity where you wish to show this // PurchaseConfirmationDialogFragment. PurchaseConfirmationDialogFragment().show( childFragmentManager, PurchaseConfirmationDialog.TAG)
Java
// From another Fragment or Activity where you wish to show this // PurchaseConfirmationDialogFragment. new PurchaseConfirmationDialogFragment().show( getChildFragmentManager(), PurchaseConfirmationDialog.TAG);
Untuk kontrol lebih besar terhadap
FragmentTransaction
,
Anda dapat menggunakan
overload show()
yang menerima FragmentTransaction
yang ada.
Siklus proses DialogFragment
DialogFragment
mengikuti siklus proses fragmen standar,
dengan beberapa callback siklus proses tambahan. Callback
paling umum adalah sebagai berikut:
onCreateDialog()
: mengganti callback ini untuk memberikanDialog
bagi fragmen untuk kelola dan tampilkan.onDismiss()
: Ganti callback ini jika Anda perlu menjalankan logika khusus saatDialog
Anda ditutup, misalnya melepas resource atau berhenti berlangganan dari sumber daya yang dapat diamati.onCancel()
: Ganti callback ini jika Anda perlu menjalankan logika khusus saatDialog
dibatalkan.
DialogFragment
juga berisi metode untuk menutup atau menyetel kemampuan pembatalan
dari DialogFragment
Anda:
dismiss()
: menutup fragmen dan dialognya. Jika fragmen ditambahkan ke data sebelumnya, semua status data sebelumnya hingga dan termasuk entri ini akan muncul. Jika tidak, transaksi baru akan di-commit untuk menghapus fragmen.setCancelable()
: mengontrol apakahDialog
yang ditampilkan dapat dibatalkan. Gunakan metode ini alih-alih langsung memanggilDialog.setCancelable(boolean)
Anda tidak mengganti
onCreateView()
atau
onViewCreated()
saat menggunakan DialogFragment
dengan Dialog
. Dialog tidak hanya
tampilan—mereka memiliki jendelanya sendiri. Dengan demikian, tidak
cukup mengganti
onCreateView()
. Selain itu, onViewCreated()
tidak pernah dipanggil di
DialogFragment
kustom kecuali Anda telah mengganti onCreateView()
dan
memberikan tampilan non-null.
Menggunakan tampilan kustom
Anda dapat membuat DialogFragment
dan menampilkan dialog dengan mengganti
onCreateView()
.
Anda dapat memberinya layoutId
, seperti pada fragmen biasa, atau menggunakan
Konstruktor DialogFragment
.
View
yang ditampilkan oleh onCreateView()
akan otomatis ditambahkan ke dialog. Dalam sebagian besar kasus, ini berarti Anda
tidak perlu mengganti
onCreateDialog()
karena dialog kosong default akan diisi dengan tampilan Anda.
Subclass DialogFragment
tertentu, seperti
BottomSheetDialogFragment
,
menyematkan tampilan Anda dalam dialog yang ditata sebagai sheet bawah.