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

ניווט אחורה – מאפשר למשתמשים לחזור אחורה בהיסטוריית המסכים שהם בחרו שבהם ביקרת בעבר. בכל מכשירי Android יש לחצן 'הקודם' מהסוג הזה ניווט, לכן אין להוסיף לחצן 'הקודם' לממשק המשתמש של האפליקציה. בהתאם ל: מכשיר ה-Android של המשתמש, הלחצן הזה יכול להיות לחצן פיזי או תוכנה לחצן.

מערכת Android שומרת מקבץ של יעדים בזמן שהמשתמש מנווט בכל שלבי האפליקציה. בדרך כלל ההגדרה הזו מאפשרת ל-Android לנווט כמו שצריך אל היעדים הקודמים בלחיצה על לחצן 'הקודם'. עם זאת, יש כמה במקרים שבהם האפליקציה שלך תצטרך ליישם התנהגות חזרה משלה על מנת מספקות את חוויית המשתמש הטובה ביותר. לדוגמה, כשמשתמשים ב-WebView, כדאי לך לשנות את התנהגות ברירת המחדל של לחצן 'הקודם' כדי לאפשר למשתמש לנווט חזרה בהיסטוריית הגלישה שלהם באינטרנט במקום במסכים הקודמים באפליקציה.

הטמעת ניווט מותאם אישית אחורה

ComponentActivity, הבסיס כיתה עבור FragmentActivity ו-AppCompatActivity, מאפשרת לשלוט בהתנהגות של לחצן 'הקודם' באמצעות OnBackPressedDispatcher, ניתן לאחזר את המספרים באמצעות getOnBackPressedDispatcher().

OnBackPressedDispatcher קובע איך אירועים של לחצן 'הקודם' יישלחו אל OnBackPressedCallback אחד או יותר אובייקטים. ה-constructor של OnBackPressedCallback לוקח את הערך הבוליאני של במצב הראשוני שמופעל. רק כאשר מופעל קריאה חוזרת (כלומר isEnabled() יחזיר true) יקרא ל-callback handleOnBackPressed() כדי לטפל באירוע של לחצן 'הקודם'. אפשר לשנות את המצב המופעל באמצעות התקשרות setEnabled()

השיחות החוזרות מתווספות באמצעות ה-methods addCallback. מומלץ מאוד להשתמש ב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(). במקרה כזה, הקריאות החוזרות מופעלות בסדר ההפוך נוספה - הקריאה האחרונה שנוספה היא הראשונה שבה ניתנת הזדמנות לטפל אירוע של לחצן 'הקודם'. לדוגמה, אם הוספתם שלוש קריאות חוזרות (callback) בשם one, two ו-three בסדר, הן יופעלו בסדר של three, two ו-one, בהתאמה.

הקריאות החוזרות (callback) מתבצעות בהתאם רשת האחריות דפוס. כל קריאה חוזרת (callback) בשרשרת מופעלת רק אם הקריאה החוזרת (callback) לא הופעלה. המשמעות היא שבכלל הדוגמה הקודמת, המערכת תפעיל קריאה חוזרת two רק אם הקריאה החוזרת היא three לא הופעלה. התקשרות חזרה one תופעל רק אם קריאה חוזרת two לא מופעלת, וכן הלאה.

לתשומת ליבכם: כשההוספה מתבצעת דרך addCallback(), הקריאה החוזרת (callback) לא תתווסף לשרשרת האחריות עד LifecycleOwner נכנס אל Lifecycle.State.STARTED .

שינוי המצב המופעל ב-OnBackPressedCallback מומלץ לבצע שינויים זמניים כי הוא שומר על הסדר שתואר קודם, זה חשוב במיוחד אם יש לכם התקשרות חזרה שנרשמות בעלים שונים של מחזור חיים מקוננים.

עם זאת, במקרים שבהם רוצים להסיר את OnBackPressedCallback לגמרי, כדאי להתקשר remove(). בדרך כלל אין צורך בכך, כי קריאות חוזרות (callback) מוסרות באופן אוטומטי כשה-LifecycleOwner המשויך שלהן הוא הושמד.

פעילות onBackClicked()

אם משתמשים onBackPressed() לטיפול באירועי לחצן 'הקודם', מומלץ להשתמש OnBackPressedCallback במקום זאת. עם זאת, אם אין אפשרות לבצע את השינוי הזה, יחולו הכללים הבאים:

  • כל הקריאות החוזרות שנרשמות דרך addCallback נבדקות כשמתקשרים super.onBackPressed().
  • ב-Android מגרסה 12 (רמת API 32) ומטה, תמיד מתבצעת קריאה אל onBackPressed, ללא קשר למופעים רשומים של OnBackPressedCallback.