عرض مربّعات الحوار باستخدام 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 في الحالات المناسبة خلال دورة حياة الجزء.

كما هي الحال في onCreateView()، يمكنك عرض أي فئة فرعية من Dialog اعتبارًا من onCreateDialog() ولا تقتصر على استخدام AlertDialog.

عرض DialogFragment

ليس عليك إنشاء FragmentTransaction يدويًا لعرض DialogFragment. يمكنك استخدام الطريقة show() لعرض مربّع الحوار. يمكنك ضبط مرجع إلى FragmentManager وString لاستخدامه كعلامة FragmentTransaction.

عند إنشاء DialogFragment من داخل Fragment، يمكنك استخدام العنصر الثانوي FragmentManager للجزء حتى تتم استعادة الحالة بشكل صحيح بعد تغييرات الإعدادات. تتيح لك العلامة غير الفارغة استخدام 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 دورة حياة الجزء العادية، مع بعض عمليات الاستدعاء الإضافية في مراحل النشاط. في ما يلي أكثرها شيوعًا:

  • onCreateDialog(): يمكنك إلغاء معاودة الاتصال هذه لتوفير Dialog للجزء لإدارته وعرضه.
  • onDismiss(): يمكنك إلغاء معاودة الاتصال هذه إذا كنت بحاجة إلى تنفيذ أي منطق مخصَّص عند إغلاق Dialog، مثل إغلاق موارد أو إلغاء الاشتراك من الموارد القابلة للملاحظة.
  • onCancel(): يمكنك إلغاء معاودة الاتصال هذه إذا كنت بحاجة إلى تنفيذ أي منطق مخصّص عند إلغاء Dialog.

تحتوي DialogFragment أيضًا على طرق لإغلاق أو ضبط إمكانية إلغاء DialogFragment:

  • dismiss(): أغلِق الجزء ومربّع الحوار الخاص به. إذا تمت إضافة الجزء إلى المكدس الخلفي، يتم إبراز كل حالة المكدس الخلفي بما في ذلك هذا الإدخال. في حال عدم تنفيذ هذا الإجراء، سيتم تنفيذ معاملة جديدة لإزالة الجزء.
  • setCancelable(): للتحكّم في ما إذا كانت علامة Dialog المعروضة قابلة للإلغاء. استخدِم هذه الطريقة بدلاً من طلب الرقم مباشرةً Dialog.setCancelable(boolean).

لا يمكنك تجاهل onCreateView() أو onViewCreated() عند استخدام DialogFragment مع Dialog. لا تُعد مربعات الحوار مجرد طرق عرض - بل لها نافذتها الخاصة. وبناءً على ذلك، لا يكفي إلغاء onCreateView(). علاوةً على ذلك، لا يتم استدعاء onViewCreated() أبدًا في DialogFragment مخصص ما لم يتم تجاوز onCreateView() وتقديم طريقة عرض غير فارغة.

استخدام طرق العرض المخصّصة

يمكنك إنشاء DialogFragment وعرض مربّع حوار عند إلغاء onCreateView(). ويمكنك إما إعطائه layoutId، كما هو الحال مع الأجزاء المعتادة، أو استخدام دالة DialogFragment الإنشائية.

تتم تلقائيًا إضافة View الذي يعرضه onCreateView() إلى مربّع الحوار. وفي معظم الحالات، يعني ذلك أنّك لا تحتاج إلى إلغاء onCreateDialog()، لأنّ مربّع الحوار التلقائي الفارغ تتم تعبئته بطريقة العرض.

تتضمّن بعض الفئات الفرعية من DialogFragment، مثل BottomSheetDialogFragment، طريقة العرض الخاصة بك في مربّع حوار مصمّم على شكل بطاقة سفلية.