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

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