Hiện hộp thoại bằng DialogFragment

DialogFragment là lớp con đặc biệt của mảnh được thiết kế nhằm tạo và lưu trữ hộp thoại. Mặc dù bạn không cần lưu trữ hộp thoại trong một mảnh, nhưng việc này sẽ cho phép FragmentManager quản lý trạng thái của hộp thoại và tự động khôi phục hộp thoại khi có thay đổi về cấu hình.

Tạo một DialogFragment

Để tạo một DialogFragment, hãy tạo lớp mở rộng DialogFragment và ghi đè onCreateDialog() như minh hoạ trong ví dụ sau.

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";
}

Tương tự như cách onCreateView() tạo View gốc trong một mảnh thông thường, onCreateDialog() sẽ tạo Dialog để hiển thị như một phần của DialogFragment. DialogFragment xử lý việc hiển thị Dialog ở các trạng thái thích hợp trong vòng đời của mảnh.

Giống như onCreateView(), bạn có thể trả về bất kỳ lớp con nào của Dialog từ onCreateDialog() và không bị giới hạn việc sử dụng AlertDialog.

Hiển thị DialogFragment

Bạn không phải tạo FragmentTransaction theo cách thủ công để hiển thị DialogFragment. Thay vào đó, hãy dùng phương thức show() để hiển thị hộp thoại của bạn. Bạn có thể chuyển thông tin tham chiếu đến FragmentManagerString để dùng làm thẻ FragmentTransaction.

Khi tạo DialogFragment từ trong Fragment, hãy dùng FragmentManager con của mảnh để trạng thái khôi phục đúng cách sau khi cấu hình thay đổi. Thẻ không rỗng cho phép bạn dùng findFragmentByTag() để truy xuất DialogFragment sau này.

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);

Để có thêm quyền kiểm soát đối với FragmentTransaction, bạn có thể dùng nhiều phương thức nạp chồng show() chấp nhận một FragmentTransaction hiện có.

Vòng đời DialogFragment

DialogFragment tuân theo vòng đời của mảnh tiêu chuẩn, kèm thêm một số phương thức gọi lại trong vòng đời. Sau đây là các lệnh gọi lại phổ biến nhất:

  • onCreateDialog(): ghi đè lệnh gọi lại này nhằm cung cấp Dialog cho mảnh để quản lý và hiển thị.
  • onDismiss(): ghi đè lệnh gọi lại này nếu bạn cần thực hiện bất kỳ logic tuỳ chỉnh nào khi Dialog bị đóng, chẳng hạn như giải phóng tài nguyên hoặc huỷ đăng ký khỏi các tài nguyên có thể ghi nhận được.
  • onCancel(): ghi đè lệnh gọi lại này nếu bạn cần thực hiện bất kỳ logic tuỳ chỉnh nào khi Dialog bị huỷ.

DialogFragment cũng chứa các phương thức để đóng hoặc đặt khả năng huỷ của DialogFragment:

  • dismiss(): đóng mảnh và hộp thoại của mảnh đó. Nếu mảnh được thêm vào ngăn xếp lui, thì tất cả trạng thái trong ngăn xếp lui cho đến và bao gồm mục này đều được đẩy ra. Nếu không, một giao tác mới sẽ tiến hành loại bỏ mảnh đó.
  • setCancelable(): kiểm soát liệu Dialog hiển thị có thể huỷ hay không. Hãy dùng phương thức này thay vì gọi trực tiếp Dialog.setCancelable(boolean).

Bạn không ghi đè onCreateView() hoặc onViewCreated() khi dùng DialogFragment với Dialog. Hộp thoại không chỉ là khung hiển thị, mà còn có cửa sổ riêng. Do đó, việc ghi đè onCreateView() là chưa đủ. Hơn nữa, onViewCreated() không bao giờ được gọi trên một DialogFragment tuỳ chỉnh trừ phi bạn đã ghi đè onCreateView() và cung cấp một khung hiển thị không rỗng.

Sử dụng khung hiển thị tuỳ chỉnh

Bạn có thể tạo DialogFragment và hiển thị hộp thoại bằng cách ghi đè onCreateView(). Bạn có thể cung cấp layoutId cho mảnh đó, giống như mảnh thông thường, hoặc dùng hàm khởi tạo DialogFragment.

View do onCreateView() trả về sẽ tự động được thêm vào hộp thoại. Trong hầu hết các trường hợp, việc này có nghĩa là bạn không cần ghi đè onCreateDialog(), vì hộp thoại trống mặc định được điền sẵn khung hiển thị của bạn.

Một số lớp con của DialogFragment, chẳng hạn như BottomSheetDialogFragment, nhúng chế độ xem trong hộp thoại được tạo kiểu như bảng dưới cùng.