Menampilkan dialog dengan DialogFragment

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 memberikan Dialog bagi fragmen untuk kelola dan tampilkan.
  • onDismiss(): Ganti callback ini jika Anda perlu menjalankan logika khusus saat Dialog Anda ditutup, misalnya melepas resource atau berhenti berlangganan dari sumber daya yang dapat diamati.
  • onCancel(): Ganti callback ini jika Anda perlu menjalankan logika khusus saat Dialog 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 apakah Dialog yang ditampilkan dapat dibatalkan. Gunakan metode ini alih-alih langsung memanggil Dialog.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.