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