Hiển thị hộp thoại bằng DialogFragment

Stay organized with collections Save and categorize content based on your preferences.

DialogFragment là một lớp con phân mảnh đặc biệt được thiết kế để tạo và lưu trữ hộp thoại. Nói một cách chính xác, bạn không cần lưu trữ hộp thoại trong một phân mảnh, nhưng làm như vậ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 xảy ra thay đổi cấu hình.

Tạo một DialogFragment

Để tạo mộtDialogFragment, trước tiên, hãy tạo lớp mở rộng DialogFragment và ghi đèonCreateDialog() như hiển thị 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 vùng root View trong một phân mảnh thông thường, onCreateDialog() phải tạo Dialog để hiển thị dưới dạng một phần của DialogFragment. DialogFragment xử lý việc hiển thị Dialog tại các trạng thái tương thích trong vòng đời của phân mảnh.

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

Đang hiển thị DialogFragment

Bạn không cần phải tạo FragmentTransaction để hiển thị DialogFragment của bạn theo cách thủ công. Thay vào đó, hãy sử dụng phương thức show() để hiển thị hộp thoại của bạn. Bạn có thể chuyển tham chiếu đến FragmentManagerString để sử dụng làm thẻ FragmentTransaction. Khi tạo DialogFragment từ Fragment, bạn phải sử dụng thẻ con FragmentManager của Fragment để đảm bảo khôi phục trạng thái đúng cách sau khi thay đổi cấu hình. Thẻ không rỗng cho phép bạn sử 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ể sử dụng nhiều phương thức nạp chồng show() chấp nhận một FragmentTransaction sẵn có.

Vòng đời DialogFragment

DialogFragment tuân theo vòng đời phân mảnh chuẩn. Ngoài ra, DialogFragment còn có một vài lệnh gọi lại vòng đời khác. 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 để cung cấp Dialog cho phân 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 tùy chỉnh nào khi Dialog của bạn bị loại bỏ, chẳng hạn như giải phóng tài nguyên, hủy đăng ký khỏi các tài nguyên được ghi nhận, v.v.
  • onCancel() – Ghi đè lệnh gọi lại này nếu bạn cần thực hiện bất kỳ logic tùy chỉnh nào khi Dialog bị hủy.

DialogFragment cũng chứa các phương thức để loại bỏ hoặc thiết lập tính năng có thể hủy cho DialogFragment:

  • dismiss() – Loại bỏ phân mảnh và hộp thoại của nó. Nếu phân mảnh được thêm vào ngăn xếp lui (back stack), thì tất cả trạng thái trong ngăn xếp lui lên đến và bao gồm mục nhập (entry) này được điều chỉnh (popped). Nếu không, một giao dịch mới sẽ thực hiện loại bỏ phân mảnh đó.
  • setCancellable() – Kiểm soát liệu Dialog được hiển thị có thể hủy hay không. Bạn nên sử dụng phương thức này thay vì gọi trực tiếp Dialog.setCancelable(boolean).

Lưu ý không được ghi đè onCreateView() hoặc onViewCreated() khi sử dụng DialogFragment với Dialog. Hộp thoại không chỉ là các chế độ xem, chúng còn có cửa sổ riêng. Do đó, ghi đè onCreateView() là không đủ. Hơn nữa, onViewCreated() không bao giờ được gọi trên một DialogFragment tùy chỉnh trừ khi bạn đã ghi đè onCreateView() và cung cấp một chế độ xem không trống.

Sử dụng chế độ xem tùy chỉnh

Bạn có thể tạo DialogFragment và hiển thị hộp thoại bằng cách ghi đè onCreateView(), hoặc chuyển cho nó một layoutId như cách bạn thường làm với một mảnh thông thường hoặc sử dụng hàm dựng 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, điều này có nghĩa là bạn không cần ghi đè onCreateDialog(), khi hộp thoại trống mặc định được điền sẵn với chế độ xem 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.