여러 백 스택 지원

탐색 구성요소는 사용자가 앱에서 이동할 때 Android 운영체제와 연동하여 백 스택을 유지합니다. 사용자가 앞뒤로 이동하는 상황에서는 경우에 따라 여러 백 스택을 동시에 유지하는 것이 도움이 될 수 있습니다. 예를 들어, 앱에 하단 탐색이나 탐색 창이 포함된 경우 여러 백 스택 지원을 사용하면 사용자가 앱 흐름 간에 자신의 위치를 잃어버리지 않고 자유롭게 전환할 수 있습니다.

탐색 구성요소는 탐색 그래프에서 대상의 상태를 저장하고 복원하여 여러 백 스택을 지원하는 API를 제공합니다. NavigationUI 클래스에는 이를 자동으로 처리하는 메서드가 포함되지만, 기본 API를 직접 사용하여 더 맞춤설정된 메서드를 구현할 수도 있습니다.

NavigationUI를 사용하여 자동 지원 구현

NavigationUI 클래스에는 사용자가 메뉴 항목 간에 이동할 때 메뉴 항목의 상태를 자동으로 저장하고 복원하는 API가 포함됩니다. 이러한 API는 다음과 같은 경우 기본적으로 여러 백 스택 지원을 구현합니다.

이러한 API는 여러 백 스택을 지원하기 위해 추가적인 코드 변경이 필요하지 않으며 앱에서 여러 백 스택을 지원하는 데 권장하는 방법입니다.

기본 API를 사용하여 직접 구현

NavigationUI에서 제공하는 요소가 요구사항을 충족하지 않는 경우 탐색 구성요소에서 제공하는 다른 API 노출 영역 중 하나를 통해 백 스택을 저장하고 복원하도록 기본 API를 사용할 수 있습니다.

탐색 XML에서 탐색 그래프의 <action> 요소는 app:popUpToSaveState 속성을 사용하여 작업이 app:popUpTo로 백 스택에서 제거한 대상의 상태를 저장할 수 있습니다. 또한 app:restoreState 속성을 사용하여 app:destination 속성에 정의된 대상의 이전 저장 상태를 복원할 수도 있습니다.

이러한 속성을 사용하여 여러 백 스택을 지원하면 됩니다. 탐색 작업으로 인해 사용자를 하나의 백 스택에서 다른 백 스택으로 옮겨야 하는 경우 대응하는 <action> 요소에 app:popUpToSaveStateapp:restoreStatetrue로 설정합니다. 이렇게 하면, 작업이 현재 백 스택의 상태를 저장하는 동시에 이전에 저장된 대상 백 스택의 상태가 있는 경우 상태를 복원합니다.

다음 예는 이러한 두 속성을 모두 사용하는 작업을 보여 줍니다.

<action
  android:id=”@+id/swap_stack”
  app:destination=”@id/second_stack”
  app:restoreState=”true”
  app:popUpTo=”@id/first_stack_start_destination”
  app:popUpToSaveState=”true” />

NavOptions 클래스를 사용하면 NavController를 사용하여 이동할 때 특별한 탐색 옵션을 전달하여 백 스택을 저장하고 복원할 수 있습니다. 이는 NavOptions의 인스턴스를 만들 때 Kotlin DSL을 사용하든 NavOptions.Builder를 사용하든 마찬가지입니다.

Kotlin

// Use the navigate() method that takes a navOptions DSL Builder
navController.navigate(selectedBottomNavRoute) {
  launchSingleTop = true
  restoreState = true
  popUpTo(navController.graph.findStartDestination().id) {
    saveState = true
  }
}

Java

NavOptions navOptions = new NavOptions.Builder()
  .setLaunchSingleTop(true)
  .setRestoreState(true)
  .setPopUpTo(NavGraph.findStartDestination(navController.getGraph()).getId(),
    false, // inclusive
    true) // saveState
  .build();
navController.navigate(selectedBottomNavId, null, navOptions);

탐색 옵션 전달에 관한 자세한 내용은 프로그래매틱 방식으로 NavOptions 적용을 참고하세요.

추가 리소스

탐색 구성요소를 통한 여러 백 스택 지원에 관한 자세한 내용은 다음 추가 리소스를 참고하세요.

블로그 게시물

샘플