تراکنش‌های بخش‌بندی

در زمان اجرا، FragmentManager می‌تواند در پاسخ به تعامل کاربر، تکه‌ها را اضافه، حذف، یا جایگزین کند و کنش‌های دیگری روی آن‌ها انجام دهد. هر مجموعه از تغییرات قطعه که شما ثبت می‌کنید، تراکنش نامیده می‌شود و می‌توانید بااستفاده از APIهای ارائه‌شده توسط کلاس FragmentTransaction مشخص کنید که چه کاری در داخل تراکنش انجام شود. می‌توانید چندین کنش را در یک تراکنش گروه‌بندی کنید—برای مثال، یک تراکنش می‌تواند چندین قطعه را اضافه یا جایگزین کند. این گروه‌بندی می‌تواند زمانی مفید باشد که چندین قطعه هم‌نیا در یک صفحه نمایش داده می‌شوند، مانند نماهای دونیمه.

می‌توانید هر تراکنش را در پشته قبلی‌ها که توسط FragmentManager مدیریت می‌شود ذخیره کنید، که به کاربر اجازه می‌دهد در تغییرات قطعه به عقب پیمایش کند—مشابه پیمایش به عقب در فعالیت‌ها.

می‌توانید با فراخوانی beginTransaction()، نمونه‌ای از FragmentTransaction را از FragmentManager دریافت کنید، همان‌طور که در مثال زیر نشان داده شده است:

کاتلین

val fragmentManager = ...
val fragmentTransaction = fragmentManager.beginTransaction()

جاوا

FragmentManager fragmentManager = ...
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

آخرین فراخوانی در هر FragmentTransaction باید تراکنش را ثبت کند. فراخوانی commit() به FragmentManager علامت می‌دهد که همه عملیات‌ها به تراکنش اضافه شده‌اند.

کاتلین

val fragmentManager = ...
// The fragment-ktx module provides a commit block that automatically
// calls beginTransaction and commit for you.
fragmentManager.commit {
    // Add operations here
}

جاوا

FragmentManager fragmentManager = ...
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

// Add operations here

fragmentTransaction.commit();

اجازه دادن به تغییر ترتیب تغییرات حالت قطعه

هر FragmentTransaction باید از setReorderingAllowed(true) استفاده کند:

کاتلین

supportFragmentManager.commit {
    ...
    setReorderingAllowed(true)
}

جاوا

FragmentManager fragmentManager = ...
fragmentManager.beginTransaction()
    ...
    .setReorderingAllowed(true)
    .commit();

برای سازگاری رفتار، پرچم مرتب‌سازی مجدد به‌طور پیش‌فرض فعال نیست. بااین‌حال، برای اینکه FragmentManager بتواند FragmentTransaction شما را به‌درستی اجرا کند، به‌ویژه زمانی که روی پشته قبلی‌ها عمل می‌کند و پویانمایی‌ها و انتقال‌ها را اجرا می‌کند، لازم است. فعال کردن پرچم تضمین می‌کند که اگر چند تراکنش باهم اجرا شوند، هیچ‌کدام از قطعه‌های واسط (یعنی قطعه‌هایی که اضافه می‌شوند و سپس بلافاصله جایگزین می‌شوند) تغییرات چرخه حیات را طی نمی‌کنند یا پویانمایی‌ها یا گذارهای آن‌ها اجرا نمی‌شود. توجه داشته باشید که این پرچم هم بر اجرای اولیه تراکنش و هم بر معکوس کردن تراکنش با popBackStack() تأثیر می‌گذارد.

افزودن و برداشتن قطعه‌ها

برای افزودن قطعه به FragmentManager، add() را در تراکنش فراخوانی کنید. این روش شناسه محفظه را برای قطعه و همچنین نام کلاس قطعه‌ای را که می‌خواهید اضافه کنید دریافت می‌کند. قطعه اضافه‌شده به وضعیت RESUMED منتقل می‌شود. اکیداً توصیه می‌شود که محفظه یک FragmentContainerView باشد که بخشی از سلسله‌مراتب نما است.

برای برداشتن قطعه از میزبان، remove() را فراخوانی کنید، و نمونه قطعه‌ای را که ازطریق findFragmentById() یا findFragmentByTag() از مدیر قطعه بازیابی شده است ارسال کنید. اگر نمای قطعه قبلاً به ظرفی اضافه شده باشد، در این مرحله نما از ظرف برداشته می‌شود. قطعه برداشته‌شده به وضعیت DESTROYED منتقل می‌شود.

از replace() استفاده کنید تا قطعه موجود در ظرف را با نمونه‌ای از کلاس قطعه جدیدی که ارائه می‌دهید جایگزین کنید. فراخوانی replace() معادل فراخوانی remove() با قطعه‌ای در محفظه و افزودن قطعه جدید به همان محفظه است.

تکه‌کد زیر نشان می‌دهد که چگونه می‌توانید یک قطعه را با قطعه دیگری جایگزین کنید:

کاتلین

// 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)
}

جاوا

// 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 به پشته قبلی‌ها اضافه نمی‌شود. برای ذخیره کردن این تغییرات، می‌توانید در FragmentTransaction با addToBackStack() تماس بگیرید. برای اطلاعات بیشتر، مدیر قطعه را ببینید.

انجام ناهمگام است

فراخوانی commit() تراکنش را فوراً انجام نمی‌دهد. بلکه تراکنش زمان‌بندی می‌شود تا به‌محض امکان در رشته میانای کاربر اصلی اجرا شود. اما درصورت لزوم می‌توانید commitNow() را فراخوانی کنید تا تراکنش قطعه فوراً در رشته میانای کاربر اجرا شود.

توجه داشته باشید که commitNow با addToBackStack ناسازگار است. یا می‌توانید همه FragmentTransactions معلق ارسال‌شده توسط commit() را که هنوز اجرا نشده‌اند با فراخوانی executePendingTransactions() اجرا کنید. این رویکرد با addToBackStack سازگار است.

برای اکثریت موارد استفاده، commit() تنها چیزی است که نیاز دارید.

ترتیب عملیات مهم است

ترتیبی که عملیات را در FragmentTransaction انجام می‌دهید مهم است، به‌ویژه هنگام استفاده از setCustomAnimations(). این روش پویانمایی‌های داده‌شده را برای همه عملیات‌های قطعه‌ای که به‌دنبال آن می‌آیند اعمال می‌کند.

کاتلین

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
}

جاوا

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() قطعه‌ای را که قبلاً جدا شده بود دوباره متصل می‌کند. این کار باعث می‌شود سلسله‌مراتب نمای آن دوباره ایجاد شود، به میانای کاربر پیوست شود، و نمایش داده شود.

As a FragmentTransaction is treated as a single atomic set of operations, calls to both detach and attach on the same fragment instance in the same transaction effectively cancel each other out, thus avoiding the destruction and immediate recreation of the fragment's UI. اگر می‌خواهید قطعه‌ای را جدا کنید و سپس بلافاصله دوباره متصل کنید، از تراکنش‌های جداگانه استفاده کنید که درصورت استفاده از commit() با executePendingOperations() از هم جدا شده‌اند.