בניווט ב-Android, המונח יעד תיבת דו-שיח מתייחס ליעדים בתרשים הניווט של האפליקציה, שמופיע כחלונות דו-שיח, שיוצרת שכבת-על של תוכן ורכיבים בממשק המשתמש של האפליקציה.
מכיוון שיעדי תיבות דו-שיח מופיעים מעל יעדים מתארחים שממלאים את
למארח הניווט, יש כמה שיקולים חשובים לגבי האופן שבו תיבת הדו-שיח
יעדים יוצרים אינטראקציה עם מקבץ הגיבוי של NavController
.
תיבת דו-שיח קומפוזבילית
כדי ליצור יעד לתיבת דו-שיח בכתיבה, צריך להוסיף יעד לNavHost
באמצעות הפונקציה dialog()
. הפונקציה מתנהגת בדרך כלל כמו
composable
, רק הוא יוצר יעד לתיבת דו-שיח ולא דף מתארח
היעד.
עיינו בדוגמה הבאה:
@Serializable
object Home
@Serializable
object Settings
@Composable
fun HomeScreen(onNavigateToSettings: () -> Unit){
Column {
Text("Home")
Button(onClick = onNavigateToSettings){
Text("Open settings")
}
}
}
// This screen will be displayed as a dialog
@Composable
fun SettingsScreen(){
Text("Settings")
// ...
}
@Composable
fun MyApp() {
val navController = rememberNavController()
NavHost(navController, startDestination = Home) {
composable<Home> { HomeScreen(onNavigateToSettings = { navController.navigate(route = Settings) }) }
dialog<Settings> { SettingsScreen() }
}
}
- יעד ההתחלה משתמש במסלול
Home
. כי הפרמטרcomposable()
מוסיף אותו לתרשים, זהו יעד מתארח. - היעד השני משתמש במסלול
Settings
.- באופן דומה, מכיוון ש-
dialog()
מוסיף אותו לתרשים, זוהי תיבת דו-שיח היעד. - כשהמשתמש מנווט מ-
HomeScreen
אלSettingsScreen
, האחרונה מופיעה מעלHomeScreen
.
- באופן דומה, מכיוון ש-
SettingsScreen
לא כולל את התוכן הקומפוזבילי שלDialog
, אבל מכיוון שזהו יעד של תיבת דו-שיח, ה-NavHost
מציג אותו בתוךDialog
.
היעדים של תיבת הדו-שיח מופיעים מעל היעד הקודם בNavHost
. כדאי להשתמש
אותם כשתיבת הדו-שיח מייצגת מסך נפרד באפליקציה שצריך
במחזור החיים ובמצב השמור, ללא תלות ביעדים אחרים
תרשים ניווט. מומלץ להשתמש בAlertDialog
או
קומפוזבילי אם רוצים תיבת דו-שיח להנחיה פחות מורכבת, כמו
אישור.
Kotlin DSL
אם אתם עובדים עם מקטעים ומשתמשים ב-Kotlin DSL כדי: יוצרים את התרשים, הוספת יעד של תיבת דו-שיח דומה מאוד להוספת יעד פיתוח נייטיב.
כדאי לבדוק איך בקטע הקוד הבא נעשה גם שימוש בפונקציה dialog()
כדי
הוספת יעד של תיבת דו-שיח שמשתמש במקטע:
// Define destinations with serializable classes or objects
@Serializable
object Home
@Serializable
object Settings
// Add the graph to the NavController with `createGraph()`.
navController.graph = navController.createGraph(
startDestination = Home
) {
// Associate the home route with the HomeFragment.
fragment<HomeFragment, Home> {
label = "Home"
}
// Define the settings destination as a dialog using DialogFragment.
dialog<SettingsFragment, Settings> {
label = "Settings"
}
}
XML
אם יש לכם DialogFragment
קיים, צריך להשתמש ברכיב <dialog>
כדי
מוסיפים את תיבת הדו-שיח לתרשים הניווט, כפי שמוצג בדוגמה הבאה:
<?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" android:id="@+id/nav_graph"> ... <dialog android:id="@+id/my_dialog_fragment" android:name="androidx.navigation.myapp.MyDialogFragment"> <argument android:name="myarg" android:defaultValue="@null" /> <action android:id="@+id/myaction" app:destination="@+id/another_destination"/> </dialog> ... </navigation>