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

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