المعاملات المجزأة

في وقت التشغيل، يمكن لأداة 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()، وإذا كنت تريد فصل الجزء ثم إعادة إرفاقه على الفور.