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()
를 사용하며 추가 Bundle
및 NavOptions
인수를 포함합니다. 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
를 사용합니다.