DialogFragment คือ
คลาสย่อยของส่วนย่อยพิเศษที่ออกแบบมาเพื่อการสร้างและการโฮสต์
กล่องโต้ตอบ แม้ว่าคุณจะไม่ต้อง
โฮสต์กล่องโต้ตอบภายในแฟรกเมนต์ เพื่อให้
FragmentManager จัดการรัฐ
ของกล่องโต้ตอบ และคืนค่ากล่องโต้ตอบโดยอัตโนมัติเมื่อมีการกำหนดค่า
มีการเปลี่ยนแปลง
สร้าง DialogFragment
หากต้องการสร้าง DialogFragment โปรดสร้างชั้นเรียนแบบขยาย
DialogFragment และ
ลบล้าง
onCreateDialog(),
ดังที่ปรากฏในตัวอย่างต่อไปนี้
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"; }
คล้ายกับวิธี
onCreateView()
สร้างราก View ในส่วนย่อยทั่วไป onCreateDialog()
สร้าง Dialog เพื่อแสดง
ในฐานะส่วนหนึ่งของ DialogFragment แฮนเดิล DialogFragment ที่แสดง
Dialog อยู่ในสถานะที่เหมาะสมในวงจรของส่วนย่อย
คุณแสดงผลคลาสย่อยของ Dialog ได้เช่นเดียวกับ onCreateView()
จาก onCreateDialog() และไม่จํากัดเพียงการใช้
AlertDialog
แสดง DialogFragment
คุณไม่จำเป็นต้องสร้าง FragmentTransaction ด้วยตนเองเพื่อ
แสดง DialogFragment ของคุณ แต่ให้ใช้เมธอด show() แทนเพื่อ
แสดงกล่องโต้ตอบ คุณส่งการอ้างอิงไปยัง FragmentManager ได้
และ String เพื่อใช้เป็นแท็ก FragmentTransaction
เมื่อสร้าง
DialogFragment จากภายใน Fragment ให้ใช้ส่วนย่อย
ย่อย FragmentManager เพื่อให้มีการคืนค่าสถานะอย่างถูกต้อง
หลังจากเปลี่ยนแปลงการกำหนดค่า แท็กที่ไม่ใช่ Null ช่วยให้คุณใช้
findFragmentByTag() เพื่อเรียกข้อมูล DialogFragment ภายหลัง
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);
เพื่อให้ควบคุมได้มากขึ้น
FragmentTransaction
คุณสามารถใช้
show()
โอเวอร์โหลดที่ยอมรับ FragmentTransaction ที่มีอยู่
วงจรการใช้งาน DialogFragment
DialogFragment จะเป็นไปตามวงจรชีวิตของ Fragment มาตรฐาน
โดยมี Callback วงจรเพิ่มเติมอีก 2-3 รายการ มากที่สุด
ซึ่งพบได้บ่อยดังต่อไปนี้
onCreateDialog(): ลบล้าง Callback นี้เพื่อระบุDialogสำหรับส่วนย่อยให้ จัดการและแสดงonDismiss(): ลบล้าง Callback นี้หากคุณต้องการดำเนินการตรรกะที่กำหนดเองเมื่อ ปิดDialogของคุณ เช่น ปล่อยทรัพยากรหรือยกเลิกการสมัคร จากแหล่งข้อมูลที่ได้รับอนุญาตให้สังเกตพฤติกรรมผู้ใช้ได้onCancel(): ลบล้าง Callback นี้หากคุณต้องการดำเนินการตรรกะที่กำหนดเองเมื่อDialogถูกยกเลิก
DialogFragment ยังมีวิธีปิดหรือตั้งค่าความสามารถในการยกเลิกด้วย
ของ DialogFragment:
dismiss(): ปิดส่วนย่อยและกล่องโต้ตอบ หากเพิ่มส่วนย่อยลงในส่วน Back Stack, สถานะ Back Stack ทั้งหมดขึ้นถึงและรวมรายการนี้จะถูกป๊อปอัป มิเช่นนั้น ธุรกรรมใหม่จะต้องนำส่วนย่อยออกsetCancelable(): ควบคุมว่าDialogที่แสดงจะยกเลิกได้หรือไม่ ใช้วิธีการนี้ แทนที่จะโทรโดยตรงDialog.setCancelable(boolean)
คุณไม่ได้ลบล้าง
onCreateView()
หรือ
onViewCreated()
เมื่อใช้ DialogFragment กับ Dialog กล่องโต้ตอบไม่เพียง
จะมีกรอบเวลาเป็นของตัวเอง ดังนั้น ไม่เพียงพอที่จะลบล้าง
onCreateView() นอกจากนี้ จะไม่มีการเรียกใช้ onViewCreated() ใน
DialogFragment ที่กำหนดเอง เว้นแต่คุณจะได้ลบล้าง onCreateView() และ
ให้การแสดงผลที่ไม่เป็นค่าว่าง
ใช้มุมมองที่กำหนดเอง
คุณสามารถสร้าง DialogFragment และแสดงกล่องโต้ตอบโดยการลบล้าง
onCreateView()
คุณสามารถสร้าง layoutId เช่นเดียวกับส่วนย่อยทั่วไป หรือใช้
เครื่องมือสร้าง DialogFragment
onCreateView() ได้คืนเงิน View
ลงในกล่องโต้ตอบโดยอัตโนมัติ ในกรณีส่วนใหญ่ นั่นหมายความว่าคุณ
ไม่จำเป็นต้องลบล้าง
onCreateDialog()
เนื่องจากกล่องโต้ตอบว่างเปล่าเริ่มต้นจะป้อนข้อมูลด้วยมุมมองของคุณ
คลาสย่อยบางอย่างของ DialogFragment เช่น
BottomSheetDialogFragment,
ฝังมุมมองของคุณในกล่องโต้ตอบที่จัดรูปแบบเป็น Bottom Sheet