İletişim kutusu hedefleri

Android navigasyonda iletişim kutusu hedefi terimi, uygulamanın gezinme grafiğinde bulunan ve iletişim pencereleri, yer paylaşımlı uygulama kullanıcı arayüzü öğeleri ve içeriği biçimindeki hedefleri ifade eder.

İletişim kutusu hedefleri gezinme ana makinesini dolduran barındırılan hedefler üzerinde göründüğünden, iletişim kutusu hedeflerinin NavController arka yığınınızla nasıl etkileşimde bulunduğuyla ilgili bazı önemli noktalar vardır.

composable iletişim kutusu

Compose'da iletişim kutusu hedefi oluşturmak için dialog() işlevini kullanarak NavHost öğenize hedef ekleyin. İşlev temelde composable ile aynı şekilde davranır, barındırılan hedef yerine yalnızca bir iletişim kutusu hedefi oluşturur.

Aşağıdaki örneği inceleyin:

@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. Başlangıç hedefi Home rotasını kullanıyor. composable() tarafından grafiğe eklendiğinden, barındırılan bir hedeftir.
  2. Diğer hedef Settings rotasını kullanıyor.
    • Benzer şekilde, dialog() bunu grafiğe eklediği için bir iletişim kutusu hedefidir.
    • Kullanıcı HomeScreen konumundan SettingsScreen konumuna gittiğinde ikinci sayfa HomeScreen üzerinden görünür.
  3. SettingsScreen bir Dialog composable'ı içermese de, iletişim kutusu hedefi olduğundan NavHost bunu bir Dialog içinde gösterir.

İletişim kutusu hedefleri, NavHost içindeki önceki hedefin üzerinde görünür. Bunları, iletişim kutusu, gezinme grafiğinizdeki diğer tüm hedeflerden bağımsız olarak kendi yaşam döngüsüne ve kaydedilmiş durumuna ihtiyacı olan ayrı bir ekranı temsil ettiğinde kullanın. Onay gibi daha az karmaşık bir istem için iletişim kutusu istiyorsanız AlertDialog veya alakalı bir composable kullanmayı tercih edebilirsiniz.

Kotlin DSL

Parçalarla çalışıyor ve grafiğinizi oluşturmak için Kotlin DSL'yi kullanıyorsanız iletişim kutusu hedefi eklemek, Oluşturma kullanımına çok benzer.

Aşağıdaki snippet'in, parça kullanan bir iletişim kutusu hedefi eklemek için dialog() işlevini de nasıl kullandığını düşünün:

// 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

Mevcut bir DialogFragment öğeniz varsa iletişim kutusunu gezinme grafiğinize eklemek için aşağıdaki örnekte gösterildiği gibi <dialog> öğesini kullanın:

<?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>