대화상자 대상

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

대화상자 대상은 탐색 호스트를 채우는 호스팅된 대상 위에 표시되므로 대화상자 대상이 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 또는 관련 컴포저블을 사용하는 것이 좋습니다.

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>