أثناء التشغيل، يمكن لعنصر
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
في حالة دورة حياة ال fragmentos الفردية التي تمت إضافتها في نطاق المعاملة. عند إنشاء
FragmentTransaction
،
setMaxLifecycle()
يضبط الحد الأقصى للحالة للقطعة المحدّدة. على سبيل المثال، يستخدم
ViewPager2
setMaxLifecycle()
للحد من الشظايا التي لا تظهر على الشاشة إلى الحالة STARTED
.
إظهار مشاهدات المقتطف وإخفاؤها
استخدِم الطريقتَين FragmentTransaction
show()
و
hide()
لإظهار عرض المقتطفات التي تمت إضافتها إلى حاوية وإخفائها.
تضبط هذه الطرق مستوى رؤية مشاهدات المقتطف بدون التأثير في
رحلة المقتطف.
على الرغم من أنّك لست بحاجة إلى استخدام معاملة مجزّأة لتبديل ظهور طرق العرض ضمن جزء، تكون هذه الطرق مفيدة للحالات التي تريد فيها ربط التغييرات في حالة مستوى الرؤية بالمعاملات على الحزمة الخلفية.
إرفاق الأجزاء وفصلها
تؤدي طريقة FragmentTransaction
detach()
إلى فصل المقتطف عن واجهة المستخدم، ما يؤدي إلى تدمير التسلسل الهرمي لعرضه. يبقى الجزء في الحالة نفسها (STOPPED
) كما هو عند وضعه في الحزمة الخلفية.
وهذا يعني أنّه تمت إزالة المقتطف من واجهة المستخدم، ولكن لا يزال يديره
مدير المقتطفات.
تعمل الطريقة
attach()
على إعادة إرفاق جزء سبق فصله منه.
ويؤدي ذلك إلى إعادة إنشاء العرض الهرمي، وإرفاقه بواجهة المستخدم، وعرضه.
بما أنّ FragmentTransaction
يتم التعامل معه كمجموعة واحدة من العمليات، فإنّه عند detach
وattach
في مثيل المقتطف نفسه في المعاملة نفسها، يتم إلغاء كل منهما الآخر بشكل فعّال، وبالتالي تجنُّب تدمير واجهة مستخدم المقتطف وإعادة إنشائها على الفور. استخدِم معاملات
منفصلة، مفصولة بـ executePendingOperations()
في حال استخدام commit()
،
إذا كنت تريد إزالة جزء ثم إعادة إرفاقه على الفور.