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