대화상자 대상

Android 탐색에서 대화상자 대상이라는 용어는 앱의 탐색 그래프 내에 있는 대상을 의미하며, 앱 UI 요소 및 콘텐츠를 오버레이하는 대화상자 창 형식을 취합니다.

대화상자 대상은 탐색 호스트를 채우는 호스팅된 대상 위에 표시되므로 대화상자 대상이 NavController의 백 스택과 상호작용하는 방식과 관련하여 몇 가지 중요한 고려사항이 있습니다.

대화상자 컴포저블

Compose에서 대화상자 대상을 만들려면 dialog() 함수를 사용하여 대상을 NavHost에 추가합니다. 이 함수는 기본적으로 composable()와 동일하게 동작하며, 호스팅된 대상이 아닌 대화상자 대상을 생성할 뿐입니다.

다음 예를 참고하세요.

@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. 시작 대상은 Home 컴포저블입니다. composable()를 사용하므로 호스팅된 대상입니다.
  2. 다른 대상은 SettingsDialog 컴포저블입니다. dialog() 함수가 변수를 그래프에 추가하므로 대화상자 대상이 됩니다. 사용자가 Home에서 SettingsDialog로 이동하면 후자는 Home 위에 표시됩니다.
  3. SettingsDialog는 대화상자 대상이므로 Dialog 컴포저블 자체를 포함하지는 않지만 NavHostDialog 내에 이를 표시합니다.

대화상자 대상은 NavHost의 이전 대상 위에 표시됩니다. 대화상자가 탐색 그래프의 다른 대상과 별개로 자체 수명 주기와 저장된 상태가 필요한 앱에서 별도의 화면을 나타낼 때 사용합니다. 확인과 같은 덜 복잡한 프롬프트를 위한 대화상자를 원하는 경우 AlertDialog 또는 관련 컴포저블을 사용하는 것이 좋습니다.

Kotlin DSL

프래그먼트로 작업하고 Kotlin DSL을 사용하여 그래프를 만드는 경우 대화상자 대상을 추가하는 것은 Compose를 사용할 때와 매우 유사합니다.

다음 스니펫에서 dialog() 함수를 사용하여 프래그먼트를 사용하는 대화상자 대상을 추가하는 방법을 고려해 보세요.

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

기존 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>