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 memberikanDialogbagi fragmen untuk kelola dan tampilkan.onDismiss(): Ganti callback ini jika Anda perlu menjalankan logika khusus saatDialogAnda ditutup, misalnya melepas resource atau berhenti berlangganan dari sumber daya yang dapat diamati.onCancel(): Ganti callback ini jika Anda perlu menjalankan logika khusus saatDialogdibatalkan.
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 apakahDialogyang 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.