في وقت التشغيل، يمكن لأداة
FragmentManager
إضافة إجراءات أخرى بأجزاء وإزالتها واستبدالها وتنفيذها
استجابة لتفاعل المستخدم. ويُطلق على كل مجموعة من التغييرات التي تجريها على الأجزاء اسم معاملة، ويمكنك تحديد الإجراء المطلوب اتخاذه داخل المعاملة باستخدام واجهات برمجة التطبيقات التي توفّرها الفئة FragmentTransaction
. يمكنك تجميع إجراءات متعددة في معاملة واحدة، فيمكن مثلاً للمعاملة إضافة أجزاء متعدّدة أو استبدالها. قد يكون هذا التجميع مفيدًا عندما يتم عرض أجزاء متعددة تابعة على الشاشة نفسها، مثل طريقة العرض المقسَّمة.
يمكنك حفظ كل معاملة في حزمة خلفية مُدارة بواسطة FragmentManager
، ما يسمح للمستخدم بالرجوع إلى الخلف عبر تغييرات الأجزاء، على غرار الانتقال للخلف بين الأنشطة.
يمكنك الحصول على مثيل لـ FragmentTransaction
من FragmentManager
من خلال استدعاء beginTransaction()
، كما هو موضح في المثال التالي:
Kotlin
val fragmentManager = ... val fragmentTransaction = fragmentManager.beginTransaction()
Java
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
يجب إتمام المعاملة في المكالمة النهائية في كل FragmentTransaction
.
يشير طلب commit()
إلى FragmentManager
بأن جميع العمليات قد تمت إضافتها إلى المعاملة.
Kotlin
val fragmentManager = ... // The fragment-ktx module provides a commit block that automatically // calls beginTransaction and commit for you. fragmentManager.commit { // Add operations here }
Java
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); // Add operations here fragmentTransaction.commit();
السماح بإعادة ترتيب تغييرات حالة الجزء
يجب أن تستخدم كل FragmentTransaction
السمة setReorderingAllowed(true)
:
Kotlin
supportFragmentManager.commit { ... setReorderingAllowed(true) }
Java
FragmentManager fragmentManager = ... fragmentManager.beginTransaction() ... .setReorderingAllowed(true) .commit();
بالنسبة إلى توافق السلوك، لا يتم تفعيل علامة إعادة الترتيب تلقائيًا.
مع ذلك، يجب السماح لـ FragmentManager
بتنفيذ FragmentTransaction
بشكل صحيح، لا سيما عند تشغيل الحزمة الخلفية وتشغيل الصور المتحركة والانتقالات. إنّ تفعيل العلامة يضمن أنّه في حال تنفيذ معاملات متعدّدة معًا، فإنّ أي أجزاء وسيطة (أي الأجزاء التي تتم إضافتها ثم يتم استبدالها على الفور) لا تمر
بتغييرات مراحل نشاطها أو تنفيذ رسومها المتحركة أو انتقالاتها. يُرجى العِلم أنّ هذه العلامة تؤثر في كل من التنفيذ الأوّلي للمعاملة وعكس
المعاملة باستخدام popBackStack()
.
إضافة الأجزاء وإزالتها
لإضافة جزء إلى FragmentManager
، استدعِ add()
في المعاملة. تتلقّى هذه الطريقة معرّف الحاوية للجزء، بالإضافة إلى اسم فئة الجزء الذي تريد إضافته. يتم نقل الجزء المُضاف إلى
الحالة RESUMED
. ننصح بشدة بأن تكون الحاوية
FragmentContainerView
جزءًا من التدرّج الهرمي لطريقة العرض.
لإزالة جزء من المضيف، استدعِ remove()
مع تمرير مثيل الجزء الذي تم استرداده من مدير الأجزاء من خلال findFragmentById()
أو findFragmentByTag()
.
إذا سبق أن تمت إضافة عرض الجزء إلى حاوية، ستتم إزالة العرض
من الحاوية عند هذه النقطة. يتم نقل الجزء الذي تمت إزالته
إلى حالة DESTROYED
.
استخدِم replace()
لاستبدال جزء حالي في إحدى الحاويات بمثيل لفئة جزء جديدة تقدّمها. يعادل استدعاء replace()
استدعاء remove()
مع إدراج جزء في حاوية وإضافة جزء جديد إلى تلك الحاوية نفسها.
يعرض مقتطف الرمز التالي كيفية استبدال جزء بجزء آخر:
Kotlin
// Create new fragment val fragmentManager = // ... // Create and commit a new transaction fragmentManager.commit { setReorderingAllowed(true) // Replace whatever is in the fragment_container view with this fragment replace<ExampleFragment>(R.id.fragment_container) }
Java
// Create new fragment and transaction FragmentManager fragmentManager = ... FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.setReorderingAllowed(true); // Replace whatever is in the fragment_container view with this fragment transaction.replace(R.id.fragment_container, ExampleFragment.class, null); // Commit the transaction transaction.commit();
في هذا المثال، يحل مثيل جديد من ExampleFragment
محل الجزء، إن وجد، الموجود حاليًا في حاوية التنسيق المحدّدة في R.id.fragment_container
.
وفقًا للإعدادات التلقائية، لا تتم إضافة التغييرات التي تم إجراؤها في FragmentTransaction
إلى المكدس الخلفي. لحفظ هذه التغييرات، يمكنك الاتصال بالرمز addToBackStack()
على FragmentTransaction
. للحصول على مزيد من المعلومات، يمكنك الاطلاع على مدير الأجزاء.
الإتمام غير متزامن.
لا يؤدي طلب الرقم
commit()
إلى إجراء المعاملة على الفور. بدلاً من ذلك، تمت جدولة
إجراء المعاملة في سلسلة محادثات واجهة المستخدم الرئيسية حالما أمكن، ولكن يمكنك طلب
commitNow()
لتشغيل معاملة التجزئة على سلسلة محادثات واجهة المستخدم على الفور.
تجدر الإشارة إلى أنّ commitNow
لا يتوافق مع addToBackStack
. بدلاً من ذلك،
يمكنك تنفيذ جميع طلبات FragmentTransactions
المعلّقة التي تم إرسالها من خلال
استدعاءات commit()
التي لم يتم تشغيلها بعد من خلال استدعاء executePendingTransactions()
. ويتوافق هذا الأسلوب مع addToBackStack
.
إنَّ "commit()
" هو كل ما تحتاج إليه في الغالبية العظمى من حالات الاستخدام.
ترتيب العمليات كبير
يُعدّ الترتيب الذي تجري به العمليات داخل
FragmentTransaction
مهمًا، خاصةً عند استخدام setCustomAnimations()
. تطبق هذه الطريقة الرسوم المتحركة المحددة على جميع عمليات الأجزاء التي تتبعها.
Kotlin
supportFragmentManager.commit { setCustomAnimations(enter1, exit1, popEnter1, popExit1) add<ExampleFragment>(R.id.container) // gets the first animations setCustomAnimations(enter2, exit2, popEnter2, popExit2) add<ExampleFragment>(R.id.container) // gets the second animations }
Java
getSupportFragmentManager().beginTransaction() .setCustomAnimations(enter1, exit1, popEnter1, popExit1) .add(R.id.container, ExampleFragment.class, null) // gets the first animations .setCustomAnimations(enter2, exit2, popEnter2, popExit2) .add(R.id.container, ExampleFragment.class, null) // gets the second animations .commit()
تقييد مراحل نشاط الجزء
يمكن أن تؤثر FragmentTransactions
في حالة مراحل نشاط الأجزاء الفردية
التي تتم إضافتها ضمن نطاق المعاملة. عند إنشاء
FragmentTransaction
، يضبط
setMaxLifecycle()
الحد الأقصى للحالة للجزء المحدد. على سبيل المثال، تستخدم
ViewPager2
setMaxLifecycle()
لحصر الأجزاء خارج الشاشة على الحالة STARTED
.
إظهار طرق عرض الأجزاء وإخفاؤها
استخدِم طريقتَي FragmentTransaction
show()
وhide()
لإظهار وإخفاء عرض الأجزاء التي تمت إضافتها إلى حاوية.
تحدّد هاتان الطُرق إمكانية عرض مشاهدات الجزئ بدون التأثير في دورة حياة الكسر.
بالرغم من أنك لست بحاجة إلى استخدام معاملة التجزئة لتبديل مستوى رؤية طرق العرض داخل جزء، فإن هذه الطرق مفيدة للحالات التي تريد فيها ربط تغييرات حالة مستوى الرؤية بالمعاملات على الحزمة الخلفية.
إرفاق الأجزاء وفصلها
تؤدّي الطريقة FragmentTransaction
detach()
إلى فصل الجزء من واجهة المستخدم، ما يؤدي إلى محو التسلسل الهرمي لطريقة العرض. يظل الجزء
بحالته نفسها (STOPPED
) كما هو الحال عند وضعه في الحزمة الخلفية.
يعني ذلك أنّه تمت إزالة الجزء من واجهة المستخدم ولكن لا يزال يديره مدير الأجزاء.
تعمل طريقة
attach()
على إعادة إرفاق جزء سبق فصله.
ويؤدي هذا إلى إعادة إنشاء العرض الهرمي لطريقة العرض، وإرفاقه بواجهة المستخدم، وعرضه.
بما أنّه يتم التعامل مع FragmentTransaction
على أنّها مجموعة صغيرة واحدة من العمليات،
تؤدي استدعاءات كل من detach
وattach
إلى مثيل الجزء نفسه في
المعاملة نفسها إلى إلغاء بعضها بعضًا بشكل فعّال، وبالتالي تجنُّب
تدمير واجهة مستخدم الجزء وإعادة إنشائها فورًا. استخدِم معاملات منفصلة ومفصولة بسمة executePendingOperations()
في حال استخدام commit()
،
وإذا كنت تريد فصل الجزء ثم إعادة إرفاقه على الفور.