عرض مربّعات الحوار باستخدام 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, تضمين طريقة العرض في مربع حوار مصمم كبطاقة سفلية.