בדף הזה מוסברות שיטות מומלצות לאינטראקציה עם מפת הניווט באפליקציה.
אם אפשר, השתמשו ב-NavigationFragment במקום ב-NavigationView
NavigationFragment wraps NavigationView ומטפל אוטומטית ב-callbacks של מחזור החיים שלו, כך שלא צריך לנהל אותם בעצמכם. הגישה הזו פחות מועדת לשגיאות, והיא הדרך המומלצת להשתמש בניווט באפליקציה. כשמשתמשים ב-NavigationFragment, לא מפעילים אירועים של מחזור החיים של NavigationView באופן ישיר.
אם משתמשים ב-NavigationView, צריך להקפיד על סדר קפדני כשמפעילים שיטות של מחזור חיים
NavigationView מארח את מפת הניווט ועוקב אחרי אירועי מחזור החיים כמו פעילויות ומקטעים ב-Android, ומבצע פעולות ספציפיות כשאירועי מחזור החיים האלה מופעלים. NavigationView מבצע כמה אתחולים ב-NavigationView#onCreate וב-NavigationView#onStart, וניקויים ב-NavigationView#onStop וב-NavigationView#onDestroy, וגם כשמעבדים אירועים אחרים של מחזור החיים.
לשיטות מחזור החיים של NavigationView יש את אותה משמעות כמו לפעילויות או למקטעים ב-Android. לדוגמה, onCreate של NavigationView מתורגם בערך ל- מכיוון שהקריאות החוזרות (callback) של מחזור החיים של NavigationView מבוססות על הקריאות החוזרות של מחזור החיים של Android ומופעלות באותו סדר, נדרש סדר קפדני של השיטות האלה של NavigationView. אחרת, יכול להיות שתיתקלו בדליפות זיכרון, בשגיאות בממשק המשתמש, בבעיות בעדכון המיקום ובבעיות אחרות.
מידע נוסף על מחזור החיים של פעילות ב-Android זמין בקטע מושגים שקשורים למחזור החיים של פעילות במאמרי העזרה למפתחים בנושא Android.
בטבלה הבאה מפורט מתי צריך להפעיל שיטות אחרות של מחזור החיים, אחרי שיטות מסוימות של מחזור החיים:
| שיטת מחזור החיים | הפונקציה מופעלת במקום שבו במחזור החיים של הפעילות | הפעלה אחרי איזו שיטה במחזור החיים |
|---|---|---|
onConfigurationChanged()
|
מופעל כשממשק המשתמש בחזית וההגדרה משתנה. | תמיד אחרי onStart()
|
onTrimMemory()
|
מופעל כשפעילות נמצאת ברקע. | תמיד אחרי onPause()
|
onSaveInstance()
|
מופעל לפני השמדת פעילות. | תמיד אחרי onStop()
|
אל תפעילו את ה-method של מחזור החיים כמה פעמים בלי להפעיל קודם את ה-method המתאימה לסגירה. בנוסף, חשוב לזכור שאם חלק מהקריאות החוזרות (callbacks) של מחזור החיים של Android מנוהלות על ידי האפליקציה עצמה, ו-NavigationView מתווסף לרכיב ה-fragment אחרי היצירה או ההתחלה, האפליקציה צריכה לקרוא לשיטות הספציפיות בסדר הנכון כדי לאתחל את Navigation SDK בצורה תקינה.
הנחיות נוספות לשימוש בשיטות האלה זמינות באפליקציית ההדגמה של Navigation SDK.
אם משתמשים ב-NavigationView, צריך להפעיל את האירועים במחזור החיים מהפעילות או מהקטע, ולא משניהם
כדי לשמור על הסדר הקפדני של ה-methods של מחזור החיים, צריך להפעיל את האירועים האלה מהפעילות או מה-callbacks של מחזור החיים של ה-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() כדי לחפש את הקטע:
לפני כן (גרסה 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 תומך בכל השיטות הציבוריות, בממשקי listener ובפקדי ממשק משתמש מותאמים אישית מ-SupportNavigationFragment עם חתימות שיטה זהות (כולל getMapAsync(), getNavigator(), setEtaCardEnabled() ו-setStylingOptions()).