대화상자 대상

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>