ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.