تراکنش های تکه ای

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

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

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

کاتلین

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 باشد که بخشی از سلسله مراتب view باشد.

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

Commit ناهمزمان است

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

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

از آنجایی که یک FragmentTransaction به عنوان یک مجموعه اتمی واحد از عملیات تلقی می شود، فراخوان هایی که برای detach و attach به یک نمونه قطعه در یک تراکنش انجام می شود، به طور موثر یکدیگر را خنثی می کنند، بنابراین از تخریب و بازآفرینی فوری UI قطعه جلوگیری می شود. اگر از commit() استفاده می‌کنید، از تراکنش‌های جداگانه استفاده کنید که با executePendingOperations() از هم جدا شده‌اند، اگر می‌خواهید یک قطعه را جدا کرده و بلافاصله دوباره وصل کنید.