در زمان اجرا،
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() از هم جدا شدهاند.