Menampilkan dialog dengan DialogFragment

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 memberikan Dialog agar fragmen dapat dikelola dan ditampilkan.
  • onDismiss(): ganti callback ini jika Anda perlu menjalankan logika kustom saat Dialog ditutup, seperti melepaskan resource atau berhenti berlangganan dari resource yang dapat diamati.
  • onCancel(): ganti callback ini jika Anda perlu menjalankan logika kustom saat Dialog 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 apakah Dialog yang ditampilkan dapat dibatalkan. Gunakan metode ini, bukan memanggil langsung Dialog.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.