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

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