옵션으로 탐색

Kotlin DSL을 사용하여 탐색 그래프에서 작업을 정의하면 탐색은 상응하는 NavAction 클래스를 생성하며 그 클래스에는 다음을 포함하여 해당 작업을 위해 정의된 구성이 포함됩니다.

  • 대상: 타겟 대상의 리소스 ID입니다.
  • 기본 인수: 타겟 대상의 기본값을 포함하는 android.os.Bundle입니다(제공되는 경우만 사용함).
  • 탐색 옵션: NavOptions로 표시되는 탐색 옵션입니다. 이 클래스에는 타겟 대상으로 또는 타겟 대상에서 다시 전환될 때 필요한 모든 특별 구성(예: 애니메이션 리소스 구성, 팝업 동작, 단일 최상위 모드에서 대상이 시작되어야 하는지 여부 등)이 포함됩니다.

Compose 옵션

기본적으로 navigate()는 새 대상을 백 스택에 추가합니다. navigate() 호출에 추가 탐색 옵션을 전달하여 navigate()의 동작을 수정할 수 있습니다.

간단한 람다를 사용하여 NavOptions의 인스턴스를 만들 수 있습니다. NavOptions.Builder에 명시적으로 전달할 수 있는 인수를 navigate()에 전달하세요. 다음 예를 고려하세요.

예를 들어 컨텍스트에서 navigate()에 옵션을 전달하는 방법에 관한 예는 백 스택 가이드를 참고하세요.

XML 옵션

다음은 두 화면으로 구성된 예 그래프이며 한 화면에서 다른 화면으로 이동하는 작업이 포함되어 있습니다.

<?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"
            xmlns:tools="http://schemas.android.com/tools"
            android:id="@+id/nav_graph"
            app:startDestination="@id/a">

    <fragment android:id="@+id/a"
              android:name="com.example.myapplication.FragmentA"
              android:label="a"
              tools:layout="@layout/a">
        <action android:id="@+id/action_a_to_b"
                app:destination="@id/b"
                app:enterAnim="@anim/nav_default_enter_anim"
                app:exitAnim="@anim/nav_default_exit_anim"
                app:popEnterAnim="@anim/nav_default_pop_enter_anim"
                app:popExitAnim="@anim/nav_default_pop_exit_anim"/>
    </fragment>

    <fragment android:id="@+id/b"
              android:name="com.example.myapplication.FragmentB"
              android:label="b"
              tools:layout="@layout/b">
        <action android:id="@+id/action_b_to_a"
                app:destination="@id/a"
                app:enterAnim="@anim/nav_default_enter_anim"
                app:exitAnim="@anim/nav_default_exit_anim"
                app:popEnterAnim="@anim/nav_default_pop_enter_anim"
                app:popExitAnim="@anim/nav_default_pop_exit_anim"
                app:popUpTo="@+id/a"
                app:popUpToInclusive="true"/>
    </fragment>
</navigation>

탐색 그래프가 확장되면 이러한 작업은 파싱되고 그래프에 정의된 구성을 사용하여 작업에 상응하는 NavAction 객체가 생성됩니다. 예를 들어, action_b_to_a는 대상 b에서 대상 a로의 이동으로 정의됩니다. 작업에는 애니메이션 및 백 스택에서 모든 대상을 삭제하는 popTo 동작이 포함됩니다. 이러한 모든 설정은 NavOptions로 캡처되고 NavAction에 연결됩니다.

NavAction을 팔로우하려면 다음 예와 같이 NavController.navigate()를 사용하여 작업의 ID를 전달합니다.

    navController.navigate(R.id.action_b_to_a)

프로그래매틱 방식으로 옵션 적용

이전 예는 탐색 그래프 XML 내에서 NavOptions를 지정하는 방법을 보여줍니다. 그러나 특정 옵션은 빌드 시간에 알 수 없는 제약 조건에 따라 달라질 수 있습니다. 이러한 경우 다음 예와 같이 NavOptions를 프로그래매틱 방식으로 만들고 설정해야 합니다.

Kotlin

findNavController().navigate(
R.id.action_fragmentOne_to_fragmentTwo,
null,
navOptions { // Use the Kotlin DSL for building NavOptions
    anim {
        enter = android.R.animator.fade_in
        exit = android.R.animator.fade_out
    }
  }
)

Java

NavController navController = NavHostFragment.findNavController(this);
  navController.navigate(
    R.id.action_fragmentOne_to_fragmentTwo,
    null,
    new NavOptions.Builder()
      .setEnterAnim(android.R.animator.fade_in)
      .setExitAnim(android.R.animator.fade_out)
      .build()
  );

이 예에서는 확장된 형태의 navigate()를 사용하며 추가 BundleNavOptions 인수를 포함합니다. navigate()의 모든 변형에는 NavOptions 인수를 허용하는 확장 버전이 있습니다.

암시적 딥 링크로 이동할 때 프로그래매틱 방식으로 NavOptions를 적용할 수도 있습니다.

Kotlin

findNavController().navigate(
    deepLinkUri,
    navOptions { // Use the Kotlin DSL for building NavOptions
        anim {
            enter = android.R.animator.fade_in
            exit = android.R.animator.fade_out
        }
    }
)

Java

NavController navController = NavHostFragment.findNavController(this);
navController.navigate(
        deepLinkUri,
        new NavOptions.Builder()
                .setEnterAnim(android.R.animator.fade_in)
                .setExitAnim(android.R.animator.fade_out)
                .build()
);

navigate()의 이 변형은 NavOptions 인스턴스뿐만 아니라 암시적 딥 링크의 Uri를 사용합니다.