בזמן הריצה,
FragmentManager
יכול להוסיף, להסיר, להחליף ולבצע פעולות אחרות במקטעים
בתגובה לאינטראקציה של המשתמש. כל קבוצת מקטעים משתנה
ההתחייבות נקראת עסקה, ואתם יכולים לציין מה לעשות
לביצוע העסקה באמצעות ממשקי ה-API שמסופקים על ידי
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 היא אסינכרונית
ביצוע שיחה
commit()
לא מבצע את העסקה באופן מיידי. במקום זאת, העסקה
תוזמן לפעול בשרשור הראשי של ממשק המשתמש ברגע שהוא יוכל לעשות זאת. אם המיקום
עם זאת, אתם יכולים לקרוא
commitNow()
כדי להריץ באופן מיידי את טרנזקציית המקטעים ב-thread של ממשק המשתמש.
הערה: 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
.
הצגה והסתרה של תצוגות המקטע
שימוש ב-methods FragmentTransaction
show()
וגם
hide()
כדי להציג ולהסתיר את התצוגה של מקטעים שנוספו לקונטיינר.
השיטות האלה מגדירות את החשיפה של תצוגות המקטע בלי להשפיע על
את מחזור החיים של הקטע.
לא צריך להשתמש בטרנזקציה של מקטעים כדי להחליף את מצב החשיפה של הצפיות בתוך מקטע, שיטות אלה שימושיות במקרים שבהם אתם רוצים שהשינויים במצב החשיפה ישויכו עסקאות במקבץ האחורי.
חיבור וניתוק של מקטעים
השיטה FragmentTransaction
detach()
מנתק את המקטע מממשק המשתמש ומוחק את היררכיית התצוגות שלו. המקטע
נשאר באותו מצב (STOPPED
) כמו כשמציבים אותו במקבץ האחורי.
המשמעות היא שהמקטע הוסר מממשק המשתמש אבל עדיין מנוהל על ידי
את מנהל המקטעים.
attach()
מצרף מחדש מקטע שממנו הוא נותק קודם.
פעולה זו גורמת ליצירת מחדש של היררכיית התצוגות שלה, המצורפת לממשק המשתמש,
ומוצגת.
כ-FragmentTransaction
מתייחסים למערך אטומי יחיד של פעולות,
קריאות ל-detach
וגם ל-attach
באותו מופע המקטע של
שאותה עסקה תבטל אחת את השנייה, וכך נמנעת
השמדה ושחזור מיידי של ממשק המשתמש של הקטע. שימוש נפרד
עסקאות, מופרדות באמצעות executePendingOperations()
אם משתמשים ב-commit()
,
אם רוצים לנתק את המקטע ואז לחבר אותו מחדש.