Đích đến của hộp thoại

Trong hoạt động điều hướng trên Android, thuật ngữ đích đến của hộp thoại dùng để chỉ các đích đến trong biểu đồ điều hướng của ứng dụng, dưới dạng cửa sổ hộp thoại, phủ lên các phần tử và nội dung trên giao diện người dùng của ứng dụng.

Vì đích đến của hộp thoại xuất hiện trên các đích đến được lưu trữ lấp đầy máy chủ điều hướng, có một số điểm quan trọng cần cân nhắc về cách đích đến của hộp thoại tương tác với ngăn xếp lui củaNavController.

Thành phần kết hợp của hộp thoại

Để tạo đích đến của hộp thoại trong Compose, hãy thêm đích đến vào NavHost bằng cách sử dụng hàm dialog(). Về cơ bản, hàm này hoạt động giống như composable(), chỉ khác là hàm này tạo đích đến của hộp thoại thay vì đích đến được lưu trữ.

Hãy xem ví dụ sau đây:

@Composable
fun SettingsDialog(){
    Text("Settings")
    // ...
}

@Composable
fun MyApp() {
    val navController = rememberNavController()
    NavHost(navController, startDestination = "home") {
        composable("home") { Home(onNavigateToHome = { navController.navigate("home") }) }
        dialog("settings") { SettingsDialog(onNavigateToSettingsDialog = { navController.navigate("settings") }) }
    }
}
  1. Đích đến bắt đầu là thành phần kết hợp Home. Vì sử dụng composable() nên đây là một đích đến được lưu trữ.
  2. Đích đến còn lại là thành phần kết hợp SettingsDialog. Vì hàm dialog() thêm đích đến này vào biểu đồ, nên đây là một đích đến của hộp thoại. Khi người dùng điều hướng từ Home đến SettingsDialog, đích đến của hộp thoại sẽ xuất hiện phía trên Home.
  3. Mặc dù SettingsDialog không bao gồm chính thành phần kết hợp Dialog, nhưng vì đây là đích đến của hộp thoại, nên NavHost sẽ hiển thị thành phần kết hợp đó trong Dialog.

Đích đến của hộp thoại xuất hiện trên đích đến trước đó trong NavHost. Hãy sử dụng các giá trị này khi hộp thoại biểu thị một màn hình riêng trong ứng dụng cần vòng đời và trạng thái đã lưu riêng, độc lập với mọi đích đến khác trong biểu đồ điều hướng của bạn. Bạn nên dùng AlertDialog hoặc thành phần kết hợp có liên quan nếu muốn hộp thoại cho lời nhắc ít phức tạp hơn, chẳng hạn như một thông báo xác nhận.

Kotlin DSL

Nếu bạn làm việc với các mảnh và đang sử dụng Kotlin DSL để tạo biểu đồ, thì việc thêm đích đến của hộp thoại cũng tương tự như khi sử dụng Compose.

Hãy cân nhắc cách sử dụng hàm dialog() trong đoạn mã sau để thêm đích đến của hộp thoại dùng một mảnh:

// Add the graph to the NavController with `createGraph()`.
navController.graph = navController.createGraph(
    startDestination = "home"
) {
    // Associate the "home" destination with the HomeFragment.
    fragment<HomeFragment>("home") {
        label = "Home"
    }

    // Define the "settings" destination as a dialog using DialogFragment.
    dialog<SettingsDialogFragment>("settings") {
        label = "Settings Dialog"
    }
}

XML

Nếu bạn đã có DialogFragment, hãy dùng phần tử <dialog> để thêm hộp thoại vào biểu đồ điều hướng như minh hoạ trong ví dụ sau:

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