مقصدهای گفتگو

در ناوبری اندروید، اصطلاح مقصد گفتگو به مقاصدی در نمودار ناوبری برنامه اشاره دارد که به شکل پنجره‌های محاوره‌ای، عناصر و محتوای رابط کاربری برنامه را پوشش می‌دهند.

از آنجا که مقاصد گفتگو بر روی مقصدهای میزبانی شده که میزبان ناوبری را پر می کنند ظاهر می شوند، ملاحظات مهمی در رابطه با نحوه تعامل مقاصد گفتگو با پشته پشته NavController شما وجود دارد.

دیالوگ قابل تنظیم

برای ایجاد یک مقصد گفتگو در Compose، با استفاده از تابع dialog() یک مقصد را به NavHost خود اضافه کنید. تابع اساساً مانند 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 یا composable مرتبط استفاده کنید.

Kotlin DSL

اگر با قطعات کار می کنید و از Kotlin DSL برای ایجاد نمودار خود استفاده می کنید، افزودن یک مقصد گفتگو بسیار شبیه به هنگام استفاده از Compose است.

در نظر بگیرید که چگونه در قطعه زیر از تابع 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>
،

در ناوبری اندروید، اصطلاح مقصد گفتگو به مقاصدی در نمودار ناوبری برنامه اشاره دارد که به شکل پنجره‌های محاوره‌ای، عناصر و محتوای رابط کاربری برنامه را پوشش می‌دهند.

از آنجا که مقاصد گفتگو بر روی مقصدهای میزبانی شده که میزبان ناوبری را پر می کنند ظاهر می شوند، ملاحظات مهمی در رابطه با نحوه تعامل مقاصد گفتگو با پشته پشته NavController شما وجود دارد.

دیالوگ قابل تنظیم

برای ایجاد یک مقصد گفتگو در Compose، با استفاده از تابع dialog() یک مقصد را به NavHost خود اضافه کنید. تابع اساساً مانند 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 یا composable مرتبط استفاده کنید.

Kotlin DSL

اگر با قطعات کار می کنید و از Kotlin DSL برای ایجاد نمودار خود استفاده می کنید، افزودن یک مقصد گفتگو بسیار شبیه به هنگام استفاده از Compose است.

در نظر بگیرید که چگونه در قطعه زیر از تابع 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>