משתמשים יכולים לנווט אחורה במסכים באמצעות ניווט לאחור. ברוב מכשירי Android יש לחצן חזרה – פיזי, תוכנה או מבוסס-תנועה. בדרך כלל לא מוסיפים לחצן 'הקודם' לאפליקציה. עם זאת, במכשירי Android Automotive OS (AAOS) במצב תאימות נעשה שימוש בלחצן 'הקודם' של המערכת. הקוד הזה מטפל בניווט, כך שאין צורך להוסיף קוד ניווט משלכם. מידע נוסף זמין במאמר מצב תאימות ל-AAOS.
מערכת Android שומרת מקבץ חזרה של יעדים כשהמשתמש מנווט באפליקציה. בדרך כלל, הפעולה הזו מאפשרת ל-Android לנווט כראוי ליעדים קודמים כשמקישים על לחצן החזרה. עם זאת, יש כמה מקרים שבהם יכול להיות שתצטרכו להטמיע באפליקציה התנהגות 'חזרה' משלכם כדי לספק את חוויית המשתמש הטובה ביותר. לדוגמה, כשמשתמשים ב-WebView
, יכול להיות שתרצו לשנות את התנהגות ברירת המחדל של לחצן החזרה כדי לאפשר למשתמש לנווט חזרה בהיסטוריית הגלישה באינטרנט במקום למסכים הקודמים באפליקציה.
הטמעת ניווט מותאם אישית אחורה
ComponentActivity
, הכיתה הבסיסית של FragmentActivity
ושל AppCompatActivity
, מאפשרת לשלוט בהתנהגות של לחצן החזרה אחורה באמצעות OnBackPressedDispatcher
, שאפשר לאחזר באמצעות קריאה ל-getOnBackPressedDispatcher()
.
המדיניות OnBackPressedDispatcher
קובעת איך אירועים של לחצן Back מועברים לאובייקט OnBackPressedCallback
אחד או יותר. ה-constructor של OnBackPressedCallback
מקבל ערך בוליאני לסטטוס ההפעלה הראשוני. רק כשהאפשרות של שיחה חוזרת מופעלת (כלומר,
isEnabled()
מחזירה את הערך true
) רק אז המפנה יבצע קריאה ל-callback handleOnBackPressed()
כדי לטפל באירוע של לחצן החזרה. אפשר לשנות את מצב ההפעלה באמצעות קריאה ל-setEnabled()
.
קריאות חוזרות מתווספות באמצעות השיטות addCallback
. מומלץ מאוד להשתמש ב-method addCallback()
שמקבל LifecycleOwner
.
כך אפשר לוודא שהערך OnBackPressedCallback
יתווסף רק כשהערך של LifecycleOwner
הוא Lifecycle.State.STARTED
.
הפעילות גם מסירה קריאות חזרה (callbacks) רשומות כשה-LifecycleOwner
המשויך לה נהרס, וכך מונעת דליפות זיכרון ומתאימה לשימוש בקטעים או בבעלים אחרים של מחזור חיים שיש להם משך חיים קצר יותר מהפעילות.
דוגמה להטמעה של קריאה חוזרת (callback):
Kotlin
class MyFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // This callback will only be 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 will only be 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()
.
כשעושים זאת, הקריאות החוזרות מופעלות בסדר הפוך לזה שבו הן נוספו – הקריאה החוזרת שנוספה אחרונה היא הראשונה שתקבל הזדמנות לטפל באירוע של לחצן החזרה אחורה. לדוגמה, אם מוסיפים שלוש פונקציות קריאה חוזרת בשמות one
, two
ו-three
בסדר, הן יקראו בסדר three
, two
ו-one
, בהתאמה.
קריאות חוזרות פועלות לפי הדפוס שרשרת האחריות. כל קריאה חוזרת (callback) בשרשרת מופעלת רק אם הקריאה החוזרת הקודמת לא הופעלה. כלומר, בדוגמה הקודמת, קריאה חוזרת two
תופעל רק אם קריאה חוזרת three
לא הופעלה. קריאה חוזרת one
תופעל רק אם קריאה חוזרת two
לא הופעלה, וכן הלאה.
שימו לב שכאשר מוסיפים את הפונקציה באמצעות addCallback()
, היא לא מתווספת לשרשרת האחריות עד ש-LifecycleOwner
נכנס למצב Lifecycle.State.STARTED
.
מומלץ מאוד לשנות את מצב ההפעלה של OnBackPressedCallback
בשינויים זמניים, כי כך נשמר הסדר שמתואר למעלה. זה חשוב במיוחד אם יש לכם קריאות חזרה (callbacks) רשומות במספר בעלי מחזור חיים בתצוגת עץ שונים.
עם זאת, במקרים שבהם רוצים להסיר את OnBackPressedCallback
לגמרי, צריך להתקשר למספר remove()
.
בדרך כלל אין צורך בכך, כי קריאות חזרה (callbacks) מוסרות באופן אוטומטי כשה-LifecycleOwner
המשויך נהרס.
Activity onBackPressed()
אם אתם משתמשים ב-onBackPressed()
כדי לטפל באירועים של לחצן החזרה, מומלץ להשתמש ב-OnBackPressedCallback
במקום זאת.
עם זאת, אם אין לכם אפשרות לבצע את השינוי הזה, יהיו בתוקף הכללים הבאים:
- כל הקריאות החוזרות שמוגדרות באמצעות
addCallback
נבדקות כשקוראים ל-super.onBackPressed()
. - ב-Android 12 (רמת API 32) ובגרסאות קודמות, תמיד מתבצעת קריאה ל-
onBackPressed
, ללא קשר למופעים רשומים שלOnBackPressedCallback
.