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 FragmentManager
và String
để 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ấpDialog
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 khiDialog
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 khiDialog
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ệuDialog
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ếpDialog.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.