בדרך כלל מומלץ להשתמש בתהליכי התחברות, קוסמים או תהליכי משנה אחרים בתוך האפליקציה שמיוצגים כתרשימי ניווט בתצוגת עץ. על ידי הצבת עץ באופן עצמאי הניווט המשני מתבצע בצורה הזו, קל יותר לבצע את התהליך הראשי בממשק המשתמש של האפליקציה. להבין ולנהל.
בנוסף, ניתן לעשות שימוש חוזר בתרשימים בתוך גרפים. הן גם מספקות רמה
אנקפסולציה – ליעדים מחוץ לתרשים בתוך התרשים אין גישה ישירה
לכל אחד מהיעדים בתוך התרשים בתוך התרשים. במקום זאת,
navigate()
לתרשים הפנימי עצמו, שבו הלוגיקה הפנימית יכולה
בלי להשפיע על שאר התרשים.
דוגמה
תרשים הניווט ברמה העליונה של האפליקציה צריך להתחיל באות היעד שהמשתמש רואה כשמפעילים את האפליקציה, והוא צריך לכלול את היעדים שהם רואים כשהם משתמשים באפליקציה שלכם.
נשתמש בתרשים הניווט ברמה העליונה מתרשים 1 כדוגמה, נניח רציתי לחייב את המשתמש לראות את המסכים title_screen ו-register רק כשהאפליקציה מופעלת בפעם הראשונה. לאחר מכן, פרטי המשתמש מאוחסנת, ובהשקות הבאות של האפליקציה, עליך לטפל בהן למסך match.
מומלץ להגדיר את מסך ההתאמה כיעד ההתחלה של בתרשים הניווט ברמה העליונה, ולהעביר את הכותרת ורישום המסכים לתוך בתרשים, כפי שמוצג באיור 1:
כשמסך ההתאמה ייפתח, בודקים אם יש משתמש רשום. אם המיקום המשתמש לא רשום, מנווטים למשתמש במסך ההרשמה.
מידע נוסף על תרחישים של ניווט מותנה זמין במאמר ניהול מותנה ניווט.
פיתוח נייטיב
כדי ליצור תרשים ניווט מקונן באמצעות 'כתיבה', משתמשים ב
NavGraphBuilder.navigation()
. השימוש שלך ב-navigation()
זהה לשימוש
NavGraphBuilder.composable()
ו-NavGraphBuilder.dialog()
משתנה בעת הוספת יעדים לתרשים.
ההבדל העיקרי הוא ש-navigation
יוצר תרשים מקונן ולא
יעד חדש. לאחר מכן צריך להתקשר אל composable()
ואל dialog()
תוך
ה-lambda של navigation()
כדי להוסיף יעדים לתרשים בתוך התרשים.
נסו לחשוב איך קטע הקוד הבא מיישם את התרשים בתרשים 2 באמצעות כתיבה:
// Routes
@Serializable object Title
@Serializable object Register
// Route for nested graph
@Serializable object Game
// Routes inside nested graph
@Serializable object Match
@Serializable object InGame
@Serializable object ResultsWinner
@Serializable object GameOver
NavHost(navController, startDestination = Title) {
composable<Title> {
TitleScreen(
onPlayClicked = { navController.navigate(route = Register) },
onLeaderboardsClicked = { /* Navigate to leaderboards */ }
)
}
composable<Register> {
RegisterScreen(
onSignUpComplete = { navController.navigate(route = Game) }
)
}
navigation<Game>(startDestination = Match) {
composable<Match> {
MatchScreen(
onStartGame = { navController.navigate(route = InGame) }
)
}
composable<InGame> {
InGameScreen(
onGameWin = { navController.navigate(route = ResultsWinner) },
onGameLose = { navController.navigate(route = GameOver) }
)
}
composable<ResultsWinner> {
ResultsWinnerScreen(
onNextMatchClicked = {
navController.navigate(route = Match) {
popUpTo(route = Match) { inclusive = true }
}
},
onLeaderboardsClicked = { /* Navigate to leaderboards */ }
)
}
composable<GameOver> {
GameOverScreen(
onTryAgainClicked = {
navController.navigate(route = Match) {
popUpTo(route = Match) { inclusive = true }
}
}
)
}
}
}
כדי לנווט ישירות ליעד בתוך יעד, צריך להשתמש בסוג המסלול הרצוי לכל יעד אחר. הסיבה לכך היא שמסלולים הם קונספט גלובלי המשמש זיהוי יעדים שכל מסך יכול לנווט אליהם:
navController.navigate(route = Match)
XML
כשמשתמשים ב-XML, אפשר להשתמש בעורך הניווט כדי ליצור את התרשים בתוך התרשים. כדי לעשות זאת:
- בעורך הניווט, לוחצים לחיצה ארוכה על המקש Shift ולאחר מכן לוחצים על יעדים שרוצים לכלול בתרשים.
לוחצים לחיצה ימנית כדי לפתוח את תפריט ההקשר ובוחרים באפשרות העברה לתרשים בתוך תרשים > תרשים חדש. היעדים מוקפים בתרשים מקונן. איור 2 מציג תרשים מקונן בעורך הניווט:
לוחצים על התרשים בתוך התרשים. המאפיינים הבאים מופיעים החלונית מאפיינים:
- סוג, שמכיל את 'תרשים מקונן'
- ID, שמכיל מזהה שהוקצה על ידי המערכת עבור התרשים בתוך התרשים. הזה המזהה משמש להפניה אל התרשים המקונן מתוך הקוד.
לוחצים לחיצה כפולה על התרשים בתוך התרשים כדי להציג את היעדים שלו.
לוחצים על הכרטיסייה טקסט כדי לעבור לתצוגת XML. תרשים ניווט בתוך תרשים נוסף לתרשים. לתרשים הניווט הזה יש
navigation
משלו וגם מזהה משלו ומאפייןstartDestination
שמצביע על היעד הראשון בתרשים המוצב:<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" app:startDestination="@id/mainFragment"> <fragment android:id="@+id/mainFragment" android:name="com.example.cashdog.cashdog.MainFragment" android:label="fragment_main" tools:layout="@layout/fragment_main" > <action android:id="@+id/action_mainFragment_to_sendMoneyGraph" app:destination="@id/sendMoneyGraph" /> <action android:id="@+id/action_mainFragment_to_viewBalanceFragment" app:destination="@id/viewBalanceFragment" /> </fragment> <fragment android:id="@+id/viewBalanceFragment" android:name="com.example.cashdog.cashdog.ViewBalanceFragment" android:label="fragment_view_balance" tools:layout="@layout/fragment_view_balance" /> <navigation android:id="@+id/sendMoneyGraph" app:startDestination="@id/chooseRecipient"> <fragment android:id="@+id/chooseRecipient" android:name="com.example.cashdog.cashdog.ChooseRecipient" android:label="fragment_choose_recipient" tools:layout="@layout/fragment_choose_recipient"> <action android:id="@+id/action_chooseRecipient_to_chooseAmountFragment" app:destination="@id/chooseAmountFragment" /> </fragment> <fragment android:id="@+id/chooseAmountFragment" android:name="com.example.cashdog.cashdog.ChooseAmountFragment" android:label="fragment_choose_amount" tools:layout="@layout/fragment_choose_amount" /> </navigation> </navigation>
בקוד, מעבירים את מזהה המשאב של הפעולה שמקשרת את תרשים הבסיס לתרשים המקונן:
Kotlin
view.findNavController().navigate(R.id.action_mainFragment_to_sendMoneyGraph)
Java
Navigation.findNavController(view).navigate(R.id.action_mainFragment_to_sendMoneyGraph);
- בחזרה לכרטיסייה עיצוב, וחזרו לתרשים השורש בלחיצה על Root.
התייחסו לתרשימי ניווט אחרים עם האפשרות Include
דרך נוספת לשנות את מבנה התרשים היא לכלול תרשים אחד בתוך
other באמצעות רכיב <include>
בתרשים הניווט שמוגדר כהורה. הזה
מאפשר להגדיר את הגרף הכלול במודול או בפרויקט נפרד
וכך למקסם את השימוש החוזר.
קטע הקוד הבא מדגים איך אפשר להשתמש ב-<include>
:
<!-- (root) nav_graph.xml -->
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/fragment">
<strong><include app:graph="@navigation/included_graph" /></strong>
<fragment
android:id="@+id/fragment"
android:name="com.example.myapplication.BlankFragment"
android:label="Fragment in Root Graph"
tools:layout="@layout/fragment_blank">
<strong><action
android:id="@+id/action_fragment_to_second_graph"
app:destination="@id/second_graph" /></strong>
</fragment>
...
</navigation>
<!-- included_graph.xml -->
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
<strong>android:id="@+id/second_graph"</strong>
app:startDestination="@id/includedStart">
<fragment
android:id="@+id/includedStart"
android:name="com.example.myapplication.IncludedStart"
android:label="fragment_included_start"
tools:layout="@layout/fragment_included_start" />
</navigation>
מקורות מידע נוספים
מידע נוסף על הניווט זמין במקורות המידע הנוספים הבאים.