יעדים לתיבות דו-שיח

בניווט ב-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() }
    }
}
  1. יעד ההתחלה משתמש במסלול Home. כי הפרמטר composable() מוסיף אותו לתרשים, זהו יעד מתארח.
  2. היעד השני משתמש במסלול Settings.
    • באופן דומה, מכיוון ש-dialog() מוסיף אותו לתרשים, זוהי תיבת דו-שיח היעד.
    • כשהמשתמש מנווט מ-HomeScreen אל SettingsScreen, האחרונה מופיעה מעל HomeScreen.
  3. 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>