ניווט אחורה – מאפשר למשתמשים לחזור אחורה בהיסטוריית המסכים שהם בחרו שבהם ביקרת בעבר. בכל מכשירי Android יש לחצן 'הקודם' מהסוג הזה ניווט, לכן אין להוסיף לחצן 'הקודם' לממשק המשתמש של האפליקציה. בהתאם ל: מכשיר ה-Android של המשתמש, הלחצן הזה יכול להיות לחצן פיזי או תוכנה לחצן.
מערכת Android שומרת מקבץ של יעדים בזמן שהמשתמש מנווט בכל שלבי האפליקציה. הפעולה הזו מאפשרת ל-Android לנווט כמו שצריך אל היעדים הקודמים בלחיצה על לחצן 'הקודם'. עם זאת, יש כמה במקרים שבהם האפליקציה שלך תצטרך ליישם התנהגות חזרה משלה כדי מספקות את חוויית המשתמש הטובה ביותר.
לדוגמה, כשמשתמשים ב-WebView
,
כדאי לשנות את התנהגות ברירת המחדל של לחצן 'הקודם' כדי לאפשר למשתמש
לנווט חזרה בהיסטוריית הגלישה שלהם באינטרנט במקום במסכים הקודמים
באפליקציה.
ב-Android מגרסה 13 ואילך יש תנועת חזרה חזויה במכשירי Android. שפת תרגום מידע נוסף על התכונה הזו זמין במאמר הוספת תמיכה לתנועת החזרה החזויה.
הטמעת ניווט מותאם אישית אחורה
ComponentActivity
, הבסיס
כיתה עבור FragmentActivity
ו-AppCompatActivity
,
מאפשר לשלוט בהתנהגות של לחצן 'הקודם' באמצעות
OnBackPressedDispatcher
,
ניתן לאחזר את המספרים באמצעות getOnBackPressedDispatcher()
.
OnBackPressedDispatcher
קובע איך אירועים של לחצן 'הקודם' יישלחו
אל OnBackPressedCallback
אחד או יותר
אובייקטים. ה-constructor של OnBackPressedCallback
לוקח את הערך הבוליאני של
במצב הראשוני שמופעל. כשמפעילים קריאה חוזרת (callback) –
isEnabled()
מחזירה true
– הסדרן קורא לפונקציה חזרה
handleOnBackPressed()
כדי לטפל באירוע של לחצן 'הקודם'. אפשר לשנות את המצב המופעל באמצעות התקשרות
setEnabled()
השיחות החוזרות מתווספות באמצעות ה-methods addCallback
. מומלץ להשתמש
addCallback()
שלוקחת את ה-LifecycleOwner
.
כך ניתן להבטיח שהOnBackPressedCallback
יתווסף רק כשה-LifecycleOwner
Lifecycle.State.STARTED
.
הפעילות גם מסירה קריאות חוזרות (callbacks) רשומים כאשר הן משויכות
LifecycleOwner
מושמד, וכך מונע דליפות זיכרון והופך את
LifecycleOwner
מתאים
לשימוש במקטעים או בעלים אחרים של מחזור חיים שיש להם משך חיים קצר יותר
מאשר בפעילות.
דוגמה להטמעת קריאה חוזרת (callback):
Kotlin
class MyFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // This callback is only called when MyFragment is at least started val callback = requireActivity().onBackPressedDispatcher.addCallback(this) { // Handle the back button event } // The callback can be enabled or disabled here or in the lambda } ... }
Java
public class MyFragment extends Fragment { @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // This callback is only called when MyFragment is at least started OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) { @Override public void handleOnBackPressed() { // Handle the back button event } }; requireActivity().getOnBackPressedDispatcher().addCallback(this, callback); // The callback can be enabled or disabled here or in handleOnBackPressed() } ... }
ניתן לבצע מספר התקשרות חזרה באמצעות addCallback()
.
כשתעשו את זה, הקריאות החוזרות יופעלו בסדר הפוך מהסדר שבו הן הוגדרו.
הוסיפו אותם — הקריאה האחרונה שנוספה היא הראשונה שבה ניתנת הזדמנות לטפל
אירוע של לחצן 'הקודם'. לדוגמה, אם מוסיפים שלוש קריאות חוזרות (callback) בשם
one
, two
ו-three
, בסדר הזה, הן מופעלות לפי הסדר
three
, two
, one
.
הקריאות החוזרות (callback) מתבצעות בהתאם
רשת האחריות
דפוס. כל קריאה חוזרת (callback) בשרשרת מופעלת רק אם
הקריאה החוזרת (callback) לא הופעלה. המשמעות היא
הדוגמה הקודמת, המערכת מפעילה two
קריאה חוזרת רק אם three
לא, הפונקציה one
תופעל רק אם הקריאה החוזרת two
לא מופעלת.
חשוב לשים לב שכאשר מתבצעת הוספה של הקריאה החוזרת באמצעות addCallback()
,
הוא לא מתווסף לשרשרת האחריות עד
LifecycleOwner
נכנס למצב Lifecycle.State.STARTED
.
מומלץ לשנות את המצב ה'מופעל' בדף OnBackPressedCallback
לשינויים זמניים, כי פעולה כזו שומרת על הסדר שתואר קודם.
זה חשוב במיוחד אם יש לך התקשרות חזרה שנרשמות במספר
בעלים מקוננים של מחזור חיים.
במקרים שבהם רוצים להסיר לגמרי את OnBackPressedCallback
,
אפשר להתקשר
remove()
.
בדרך כלל אין צורך לעשות זאת, מפני שהקריאות החוזרות מוסרות באופן אוטומטי כאשר
LifecycleOwner
שמשויך אליהם הוא
הושמד.
פעילות onBackClicked()
אם משתמשים
onBackPressed()
לטיפול באירועי לחצן 'הקודם', מומלץ להשתמש
OnBackPressedCallback
במקום זאת.
עם זאת, אם אין אפשרות לבצע את השינוי הזה, יחולו הכללים הבאים:
- כל הקריאות החוזרות שנרשמות דרך
addCallback
נבדקות כשמתקשריםsuper.onBackPressed()
. - ב-Android מגרסה 12 (רמת API 32) ומטה, תמיד מתבצעת קריאה אל
onBackPressed
, ללא קשר למופעים רשומים שלOnBackPressedCallback
.