در زمان اجرا، یک 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()
از هم جدا شدهاند، اگر میخواهید یک قطعه را جدا کرده و بلافاصله دوباره وصل کنید.