לספק אפשרויות ניווט מותאמות אישית חזרה

משתמשים יכולים לנווט אחורה במסכים באמצעות ניווט לאחור. ברוב מכשירי 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.