Destinations outside of the nested graph, such as those on the root graph, access the nested graph only through its start destination. https://developer.android.com/guide/navigation/navigation-nested-graphs

공식문서에서 Nested Graph에 있는 destination은 start destination을 통해서만 접근할 수 있다고 되어 있습니다. 왜요? 저는 원하는 destiation으로 바로 가고 싶어요! 라는 생각이 들었고, start destination을 건너띄고 바로 이동할 수 있는 방법을 찾아봤습니다.

방법은 setGraph


setGraph 함수를 이용해 nested Graph로 전환한 후, global action을 이용하면 nested Graph의 원하는 destination으로 바로 이동할 수 있습니다.

예를들어, 그래프가 아래와 같이 되어 있고, B Frgamnet에서 E Fragment로 이동하고 싶을 때 아래와 같이 코드를 작성할 수 있습니다.

graph 그림.png

<navigation
    android:id="@+id/inner_nav_graph"
    app:startDestination="@id/dFrgment">

...

    <action
        android:id="@+id/action_global_eFragment"
        app:destination="@id/eFragment" />
</navigation>

...

navController.setGraph(R.navigation.inner_nav_graph)
navController.navigate(R.id.action_global_eFragment)

문제 발생


ide 그림.png

IDE 상단에 있는 A 버튼을 누르면, 프로젝트의 변경 점을 반영하며 Activity를 재실행합니다. 현재까지 실행한 데이터들은 그대로 유지하기 때문에 UI를 변경할 때 유용합니다.

하지만 위 예시에서처럼 E Fragment로 전환한 후, Apply changed를 누르면 아래와 같은 IDE 에러가 발생하며 앱이 죽는 문제가 발생했습니다.

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.stop, PID: 7622
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.stop/com.stop.MainActivity}: java.lang.IllegalArgumentException: No destination with ID 2131231089 is on the NavController's back stack. The current destination is NavGraph(com.stop:id/inner_nav_graph) startDestination={Destination(com.stop:id/eFragment) label=EFragment class=com.stop.ui.route.EFragment}

...

     Caused by: java.lang.IllegalArgumentException: No destination with ID 2131231089 is on the NavController's back stack. The current destination is NavGraph(com.stop:id/inner_nav_graph) startDestination={Destination(com.stop:id/eFragment) label=EFragment class=com.stop.ui.route.EFragment}
...

디버깅 모드로 실행하면 A 버튼이 비활성화되는데, 개발자 모드의 활동 유지 안함을 킨 후, 홈 버튼을 누른 후 앱을 다시 진입하면 activity를 다시 재생성하도록 강제할 수 있습니다.

activity 재생성 강제하기.PNG

원인은 setGraph