17

I have implemented a nested graph in Navigation graph, which is having 2 graphs. In the first graph, there are 3 fragments and in the second graph, there are 2 fragments. Graph 2 is included in graph 1. I want to navigate to (graph 1 step 1) to (graph 2 step 2). We can not define action between two nested fragments. So is there any way by which we can assign the dynamic destination to navigation?

enter image description here

Graph 1

<?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/mobile_navigation"
    app:startDestination="@id/dashboardFragment">
    <fragment
        android:id="@+id/dashboardFragment"
        android:name="com.navigationgraphexample.fragments.DashboardFragment"
        android:label="fragment_dashboard"
        tools:layout="@layout/fragment_dashboard" >
        <action
            android:id="@+id/action_dashboardFragment_to_stepOneFragment2"
            app:destination="@id/stepOneFragment" />
        <action
            android:id="@+id/action_dashboardFragment_to_sub_nav"
            app:destination="@id/sub_nav" />

    </fragment>
    <fragment
        android:id="@+id/stepOneFragment"
        android:name="com.navigationgraphexample.fragments.StepOneFragment"
        android:label="fragment_step_one"
        tools:layout="@layout/fragment_step_one">
        <action
            android:id="@+id/action_stepOneFragment_to_stepTwoFragment"
            app:destination="@id/stepTwoFragment" />
    </fragment>
    <fragment
        android:id="@+id/stepTwoFragment"
        android:name="com.navigationgraphexample.fragments.StepTwoFragment"
        android:label="fragment_step_two"
        tools:layout="@layout/fragment_step_two" />
    <fragment
        android:id="@+id/notificationFragment"
        android:name="com.navigationgraphexample.fragments.NotificationFragment"
        android:label="fragment_notification"
        tools:layout="@layout/fragment_notification" >
        <deepLink
            android:id="@+id/deepLink"
            app:uri="myapp.com/{myargs}"
            />
        <argument android:name="myargs"
            app:argType="integer"
            android:defaultValue="1" />
    </fragment>
    <include app:graph="@navigation/sub_nav" />
</navigation>

Graph 2

<?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/sub_nav"
    app:startDestination="@id/createNewTaskFragment">

    <fragment
        android:id="@+id/listFragment"
        android:name="com.navigationgraphexample.fragments.ListFragment"
        android:label="fragment_list"
        tools:layout="@layout/fragment_list" />
    <fragment
        android:id="@+id/createNewTaskFragment"
        android:name="com.navigationgraphexample.fragments.CreateNewTaskFragment"
        android:label="fragment_create_new_task"
        tools:layout="@layout/fragment_create_new_task" >
        <action
            android:id="@+id/action_createNewTaskFragment_to_listFragment"
            app:destination="@id/listFragment" />
    </fragment>
</navigation>

I have checked this solution but it is not for the nested graph!

Maddy
  • 4,525
  • 4
  • 33
  • 53
  • You can try manually building a NavHostFragment and Graph objects manually, but keep in mind you can't access the controller in onCreate. – Paul T. Jan 09 '19 at 16:16

1 Answers1

17

As far as class NavGraph extends NavDestination, you can try the following to change nested graph's startDestination before calling navigate to sub_nav:

val graph = navController.graph.findNode(R.id.sub_nav)
if (graph is NavGraph) {
    graph.startDestination = R.id.createNewTaskFragment
}

UPD: Since version 2.4.0 all Navigation artifacts have been rewritten in Kotlin, so the setter should be accessed by it's original name:

graph.setStartDestination(R.id.createNewTaskFragment)
  • 2
    can use this to find the current destination nested graph: findNavController().currentDestination?.parent?.findNode(R.id.nestedGraph) – user2301281 Oct 06 '20 at 06:04