-
Navigation Component(2)Android 2021. 5. 19. 19:37
대상(Destinations) 이동
대상(Destinations)으로 이동하는 것은 NavController 객체를 사용하여 실행되며 NavController는 NavHost내에서 앱 탐색을 관리한다.
Fragment, Activity 또는 View의 NavController를 가져오려면 다음 메서드 중 하나를 사용한다. (Kotlin기준)- Fragment.findNavController()
- View.findNavController()
- Activity.findNavController(viewId: Int)
ID를 사용한 이동
navigate(int) 는 Action 또는 대상(Destinations)의 리소스 ID를 사용합니다.
버튼의 경우는 Navigation 클래스의 createNavigateOnClickListener() 메서드를 사용할 수 있다.
ID를 사용하여 이동할 때 가능하다면 Action을 사용하는 것이 좋다.
view.findViewById<Button>(R.id.next_button).setOnClickListener { //TODO using Navigation.createNavigateOnClickListener(action_id or destination_id) //Navigation.createNavigateOnClickListener(R.id.next_action, null).onClick(view) //Navigation.createNavigateOnClickListener(R.id.home_dest, null).onClick(view) //TODO using NavController.navigate(action_id or destination_id) Navigation.findNavController(view).navigate(R.id.next_action) }
Navigation 및 Back Stack
Android는 방문한 대상을 포함하는 백 스택을 유지한다.
navigate() 메소드는 호출될 때마다 또 다른 대상(Destinations)을 스택의 맨 위에 놓는다.
Up 또는 Back을 탭하면 NavController.navigateUp() 과 NavController.popBackStack() 메서드가 각각 호출되어 스택 최상단의 대상을 삭제(또는 pop)한다.
NavController.popBackStack() 메서드가 false를 반환하면 NavController.getCurrentDestination()은 null을 반환한다.
아래 예와 같이 새로운 대상(Destinations)으로 이동하거나 Activity의 finish()를 호출해야 한다.
... if (!navController.popBackStack()) { // Call finish() on your Activity finish() }
popUpTo 및 popUpToInclusive
action을 사용하여 이동할 때 back stack에서 추가 대상(Destinations)을 pop하도록 선택할 수 있다.
(예 : 사용자가 로그인했을 때 back 버튼을 눌러도 로그인 흐름으로 돌아가지 않도록 로그인 관련 대상(Destinations)은 back stack에서 pop해야 한다)
현재 대상(Destinations)에서 다른 대상(Destinations)으로 이동할때 대상(Destinations)을 pop할려면 app:popUpTo 속성을 <action> 요소에 추가한다. app:popUpToInclusive="true"를 추가하여 app:popUpTo에 지정된 대상(Destinations)이 back stack에서 삭제될 수도 있다는 것을 나타낼 수도 있다.
위의 Navigation Graph처럼 앱에 A, B, C 세 개의 대상과 A에서 B로, B에서 C로, C에서 A로 연결되는 작업이 있다고 가정했을 때 반복적으로 이동한다면 back stack에는 각 대상(Destinations)의 여러 세트(A, B, C, A, B, C, A등)가 포함된다. 이 반복을 피하려면 예와 같이 대상(Destinations) C에서 대상(Destinations) A로 이동하는 작업에 app:popUpTo와 app:popUpToInclusive를 지정하면 된다.
<fragment android:id="@+id/c" android:name="com.example.myapplication.C" android:label="fragment_c" tools:layout="@layout/fragment_c"> <action android:id="@+id/action_c_to_a" app:destination="@id/a" app:popUpTo="@+id/a" app:popUpToInclusive="true"/> </fragment>
대상(Destinations) C에서 대상(Destinations) A로 다시 이동하면 A도 popUpTo하며 이는 이동하는 동안 B와 C를 스택에서 삭제하는 것을 의미한다.
app:popUpToInclusive="true"인 경우 스택에서 첫 번째 A도 pop하여 효과적으로 스택을 비운다.
app:popUpToInclusive를 사용하지 않는다면 백 스택은 대상(Destinations) A 인스턴스 두 개를 포함하게 된다.
References
'Android' 카테고리의 다른 글
Android Kotlin Fundamentals - ViewModel(1) (0) 2021.05.29 ViewModel (0) 2021.05.28 Navigation Component(1) (0) 2021.05.18 SurfaceView (0) 2021.05.13 ADB Shell 명령어 정리 (0) 2021.04.25