Home > Net >  Navigation action/destination cannot be found from the current destination - nested nav graph
Navigation action/destination cannot be found from the current destination - nested nav graph

Time:03-05

I'm new to both Android development as a whole and nav graphs in particular. I have a Home screen with a bottom navigation component (fragments 2-5) and 4 buttons that navigate to other fragments (fragments 6-9). To get this structure to work I struggled with the same error and it eventually stopped giving errors, although I'm not confident that I "fixed" the issue properly. This is backed by the fact that I'm getting the same error now that I'm attempting to wrap the activity with a navigation drawer component. Please help me resolve this error and structure my code correctly. The error occurs when I click a button on the home fragment (navigation drawer and bottom nav behave as expected, currently).

My main_navigation.xml (details omitted for brevity):

    ...
    <!-- Nav graph for the 4 buttons on Home fragment-->
    <include app:graph="@navigation/home_nav_graph" />

    <!--start destination - also part of home_nav_graph-->
    <fragment
        android:id="@ id/fragment_home"
        ...
    </fragment>

    <fragment
        android:id="@ id/fragment_2"
        ...
    </fragment>
    <fragment
        android:id="@ id/fragment_3"
        ...
    </fragment>
    <fragment
        android:id="@ id/fragment_4"
        ...
    </fragment>
    <fragment>
        android:id="@ id/fragment_5"
        ...
    </fragment>

    <!--Navigation drawer-->
    <fragment
        android:id="@ id/fragment_10"
        ... />

    <fragment
        android:id="@ id/fragment_11"
        ... />

    <fragment
        android:id="@ id/fragment_12"
        ... />
    </navigation>

My home_nav_graph.xml (responsible for navigating from home to the 4 subsequent fragments through the buttons):

        <fragment
        android:id="@ id/fragment_home"
        ... >
        <action
            android:id="@ id/action_home_to_fragment6"
            app:destination="@id/fragment_6" />
        <action
            android:id="@ id/action_home_to_fragment7"
            app:destination="@id/fragment_7" />
        <action
            android:id="@ id/action_home_to_fragment8"
            app:destination="@id/fragment_8" />
        <action
            android:id="@ id/action_home_to_fragment9"
            app:destination="@id/fragment_9" />
    </fragment>
    <fragment
        android:id="@ id/fragment_6"
        ... >
        <action
            android:id="@ id/action_fragment6_to_homeFragment"
            app:destination="@id/fragment_home" />
    </fragment>
    <fragment
        android:id="@ id/fragment_7"
        ... >
        <action
            android:id="@ id/action_fragment7_to_homeFragment"
            app:destination="@id/fragment_home" />
    </fragment>
    <fragment
        android:id="@ id/fragment_8"
        ... >
        <action
            android:id="@ id/action_fragment8_to_homeFragment"
            app:destination="@id/fragment_home" />
    </fragment>
    <fragment
        android:id="@ id/fragment_9"
        ... >
        <action
            android:id="@ id/action_fragment9_to_homeFragment"
            app:destination="@id/fragment_home" />
    </fragment>
</navigation>

Home Activity .kt file:

class HomeActivity : AppCompatActivity() {

    private lateinit var binding: HomeActivityBinding
    private lateinit var navController: NavController
    private lateinit var appBarConfiguration: AppBarConfiguration

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = HomeActivityBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)

        // ...

        // Set-up bottom navigation menu & Side menu
        val navView: NavigationView = binding.navView
        val bottomNavView: BottomNavigationView = findViewById(R.id.bottom_nav_view)
        val drawerLayout: DrawerLayout = binding.homeLayout // from navi drawer structure

        val navHostFragment = supportFragmentManager
            .findFragmentById(R.id.nav_host_fragment_home_activity) as NavHostFragment
        navController = navHostFragment.navController

        // val navController = findNavController(R.id.nav_host_fragment_home_activity)
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        appBarConfiguration = AppBarConfiguration(
            setOf(
                R.id.fragment_home,
                R.id.fragment_2,
                R.id.fragment_3,
                R.id.fragment_4,
                R.id.fragment_5
            ), drawerLayout
        )
        setupActionBarWithNavController(navController, appBarConfiguration)
        navView.setupWithNavController(navController)
        bottomNavView.setupWithNavController(navController)
    }

If you would like me to attach more Kotlin files let me know which ones.

CodePudding user response:

Eventually solved my own problem. I moved all the nested destinations into the top level nav graph.

  • Related