แสดงกล่องโต้ตอบด้วย DialogFragment

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