DialogFragment
adalah
subclass fragmen khusus yang dirancang untuk membuat dan menghosting
dialog. Meskipun Anda tidak perlu
menghosting dialog dalam fragmen, hal ini memungkinkan
FragmentManager
mengelola status
dialog dan otomatis memulihkan dialog saat terjadi perubahan
konfigurasi.
Membuat DialogFragment
Untuk membuat DialogFragment
, buat class yang memperluas
DialogFragment
dan
mengganti
onCreateDialog()
,
seperti ditunjukkan pada 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 cara
onCreateView()
membuat View
root 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 Dialog
apa pun dari onCreateDialog()
dan tidak terbatas pada penggunaan
AlertDialog
.
Menampilkan DialogFragment
Anda tidak perlu membuat FragmentTransaction
secara manual untuk
menampilkan DialogFragment
. 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 FragmentManager
turunan
fragmen 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()
: ganti callback ini untuk memberikanDialog
agar fragmen dapat dikelola dan ditampilkan.onDismiss()
: ganti callback ini jika Anda perlu menjalankan logika kustom saatDialog
ditutup, seperti melepaskan resource atau berhenti berlangganan dari resource yang dapat diamati.onCancel()
: ganti callback ini jika Anda perlu menjalankan logika kustom saatDialog
dibatalkan.
DialogFragment
juga berisi metode untuk menutup atau menetapkan kemampuan pembatalan
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, bukan memanggil langsungDialog.setCancelable(boolean)
.
Anda tidak mengganti
onCreateView()
atau
onViewCreated()
saat menggunakan DialogFragment
dengan Dialog
. Dialog tidak hanya
tampilan, tetapi juga memiliki jendelanya sendiri. Dengan demikian, mengganti
onCreateView()
tidaklah cukup. 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 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.