בדף הזה מוסברות השיטות המומלצות לאינטראקציה עם מפת הניווט באפליקציה.
אם אפשר, השתמשו ב-NavigationFragment במקום ב-NavigationView
NavigationFragment עוטף את NavigationView ומטפל באופן אוטומטי בקריאות החוזרות במחזור החיים שלו, כך שאתם לא צריכים לנהל אותן בעצמכם. הגישה הזו פחות מועדת לשגיאות, והיא הדרך המומלצת להשתמש בניווט באפליקציה. כשמשתמשים ב-NavigationFragment, לא מפעילים אירועים במחזור חיים של NavigationView באופן ישיר.
אם משתמשים ב-NavigationView, צריך להשתמש בסדר קפדני כשמפעילים שיטות של מחזור חיים
NavigationView מארח את מפת הניווט ועוקב מקרוב אחרי אירועי מחזור החיים כפעילויות וכמקטעים (fragments) של Android, ומבצע פעולות ספציפיות כשאירועי מחזור החיים האלה מופעלים. NavigationView מבצע כמה אתחולים ב-NavigationView#onCreate וב-NavigationView#onStart, וניקויים ב-NavigationView#onStop וב-NavigationView#onDestroy, וגם כשאירועים אחרים במחזור חיים מעובדים.
לשיטות מחזור החיים של NavigationView יש אותה משמעות כמו לפעילויות או למקטעים (fragments) ב-Android. לדוגמה, onCreate של NavigationView מתורגם בערך ל-lifecycle callbacks מהפעילות או מהקטע ב-Android, וצריך להפעיל אותו באמצעות קריאות חוזרות במחזור חיים מהפעילות או מהמקטע ב-Android. מכיוון שהקריאות החוזרות במחזור החיים של NavigationView מבוססות על הקריאות החוזרות במחזור החיים של Android ומופעלות באותו סדר, נדרש סדר קפדני של השיטות האלה של NavigationView. אחרת, יכול להיות שתיתקלו בדליפות זיכרון, שגיאות בממשק המשתמש, מיקום שלא מתעדכן ובעיות אחרות.
מידע נוסף על מחזור החיים של פעילות ב-Android זמין בקטע מושגים שקשורים למחזור החיים של פעילות במאמרי העזרה למפתחים של Android.
בטבלה הבאה מפורט מתי צריך להפעיל מתודות אחרות של מחזור חיים, אחרי מתודות מסוימות של מחזור חיים:
| שיטת מחזור החיים | מופעלת במקום כלשהו במחזור החיים של הפעילות | מופעלת אחרי איזו שיטה של מחזור חיים |
|---|---|---|
onConfigurationChanged()
|
מופעל כשממשק המשתמש נמצא בחזית וההגדרות משתנות. | תמיד אחרי onStart()
|
onTrimMemory()
|
מופעל כשפעילות נמצאת ברקע. | תמיד אחרי onPause()
|
onSaveInstance()
|
מופעל לפני שפעילות נהרסת. | תמיד אחרי onStop()
|
אל תפעילו את השיטות האלה של מחזור החיים כמה פעמים בלי להפעיל קודם את שיטת הסגירה המתאימה. בנוסף, חשוב לזכור שאם חלק מקריאות חוזרות במחזור החיים האלה של Android מנוהלות על ידי האפליקציה עצמה, ו-NavigationView מתווסף למקטע (fragment) אחרי היצירה או ההפעלה, האפליקציה צריכה להפעיל את השיטות הספציפיות בסדר הנכון כדי לאתחל בצורה תקינה את Navigation SDK.
לקבלת הנחיות נוספות לגבי השימוש בשיטות האלה, אפשר לעיין באפליקציית ההדגמה של Navigation SDK.
אם משתמשים ב-NavigationView, צריך להפעיל אירועים במחזור החיים מהפעילות או מהקטע, ולא משניהם
כדי לשמור על הסדר הקפדני של השיטות במחזור החיים, צריך להפעיל את האירועים האלה מהקריאות החוזרות במחזור חיים של הפעילות או של המקטע (fragment), שמקבלות את האירועים האלה לפי הסדר. כך לא צריך לתאם בין מקטעים ופעילויות באפליקציות, מה שעלול לגרום לקריאות כפולות.
עדכון מ-SupportNavigationFragment ל-NavigationFragment
החל מגרסה 8.0.0 של Navigation SDK, NavigationFragment מחליף את SupportNavigationFragment שהוצא משימוש בתור מאגר החלקים הרגיל לניווט מפורט ולהצגת מפה.
NavigationFragment שומר על שוויון מלא של API עם SupportNavigationFragment.
כדי לעדכן את האפליקציה, צריך להחליף את SupportNavigationFragment ב-NavigationFragment בקובצי הפריסה של ה-XML ובייבוא של קוד המקור. כל החתימות של השיטות והקריאות ל-getSupportFragmentManager() נשארות זהות.
עדכון קובץ ה-XML של הפריסה
מחליפים את SupportNavigationFragment ב-NavigationFragment בקובצי ה-XML של הפריסה:
לפני (גרסה 7.x וגרסאות קודמות):
<fragment
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/navigation_fragment"
android:name="com.google.android.libraries.navigation.SupportNavigationFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
אחרי (גרסה 8.0.0 ואילך):
<fragment
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/navigation_fragment"
android:name="com.google.android.libraries.navigation.NavigationFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
אם האפליקציה משתמשת ב-FragmentContainerView (מומלץ לאירוח מקטעים), צריך לעדכן את המאפיין android:name:
<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/navigation_fragment"
android:name="com.google.android.libraries.navigation.NavigationFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
עדכון קוד האפליקציה
מחליפים את הייבוא ואת ההמרה של המחלקות בקוד Java או Kotlin. מכיוון ששתי המחלקות מרחיבות את androidx.fragment.app.Fragment, ממשיכים להשתמש ב-getSupportFragmentManager() כדי לחפש את ה-fragment:
לפני (גרסה 7.x וגרסאות קודמות):
Java
import com.google.android.libraries.navigation.SupportNavigationFragment; public class MainActivity extends AppCompatActivity { private SupportNavigationFragment mNavFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mNavFragment = (SupportNavigationFragment) getSupportFragmentManager() .findFragmentById(R.id.navigation_fragment); } }
Kotlin
import com.google.android.libraries.navigation.SupportNavigationFragment class MainActivity : AppCompatActivity() { private lateinit var navFragment: SupportNavigationFragment override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) navFragment = supportFragmentManager .findFragmentById(R.id.navigation_fragment) as SupportNavigationFragment } }
אחרי (גרסה 8.0.0 ואילך):
Java
import com.google.android.libraries.navigation.NavigationFragment; public class MainActivity extends AppCompatActivity { private NavigationFragment mNavFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mNavFragment = (NavigationFragment) getSupportFragmentManager() .findFragmentById(R.id.navigation_fragment); } }
Kotlin
import com.google.android.libraries.navigation.NavigationFragment class MainActivity : AppCompatActivity() { private lateinit var navFragment: NavigationFragment override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) navFragment = supportFragmentManager .findFragmentById(R.id.navigation_fragment) as NavigationFragment } }
שוויון ב-API
לא צריך לבצע שינויים אחרים בהתנהגות או לשנות את מבנה הקוד.
NavigationFragment תומך בכל השיטות הציבוריות, ממשקי המאזינים ורכיבי האינטראקציה המותאמים אישית של ממשק המשתמש מ-SupportNavigationFragment עם חתימות שיטה זהות (כולל getMapAsync(), getNavigator(), setEtaCardEnabled() ו-setStylingOptions()).