Dalam navigasi Android, istilah tujuan dialog mengacu pada tujuan dalam grafik navigasi aplikasi yang berbentuk jendela dialog, yang menempatkan elemen dan konten UI aplikasi.
Karena tujuan dialog muncul di tujuan yang dihosting yang mengisi
ada beberapa pertimbangan
penting mengenai cara
tujuan berinteraksi dengan data NavController
sebelumnya.
Composable dialog
Untuk membuat tujuan dialog di Compose, tambahkan tujuan ke NavHost
menggunakan fungsi dialog()
. Fungsi ini pada dasarnya berperilaku sama seperti
composable
, hanya saja fungsi ini membuat tujuan dialog, bukan tujuan
yang dihosting.
Perhatikan contoh berikut:
@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() }
}
}
- Tujuan awal menggunakan rute
Home
. Karenacomposable()
menambahkannya ke grafik, yang merupakan tujuan yang dihosting. - Tujuan lainnya menggunakan rute
Settings
.- Demikian pula, karena
dialog()
menambahkannya ke grafik, maka dialog akan muncul tujuan. - Saat pengguna menavigasi dari
HomeScreen
keSettingsScreen
, yang terakhir muncul di atasHomeScreen
.
- Demikian pula, karena
- Meskipun
SettingsScreen
tidak menyertakan composableDialog
itu sendiri, karena merupakan tujuan dialog, makaNavHost
menampilkannya dalamDialog
.
Tujuan dialog muncul di atas tujuan sebelumnya di NavHost
. Gunakan
ketika dialog mewakili layar terpisah di aplikasi yang membutuhkan
siklus proses dan status tersimpan, terlepas dari tujuan lain di
grafik navigasi. Anda mungkin lebih memilih menggunakan AlertDialog
atau composable
terkait jika menginginkan dialog untuk perintah yang tidak terlalu rumit, seperti
konfirmasi.
DSL Kotlin
Jika Anda menangani fragmen dan menggunakan DSL Kotlin untuk membuat grafik, penambahan tujuan dialog sangat mirip dengan saat menggunakan Compose.
Perhatikan cara dalam cuplikan berikut juga menggunakan fungsi dialog()
untuk
menambahkan tujuan dialog yang menggunakan fragmen:
// 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
Jika sudah memiliki DialogFragment
, gunakan elemen <dialog>
untuk
tambahkan dialog ke grafik navigasi, seperti yang ditunjukkan pada contoh berikut:
<?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>