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