Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

FragmentContainerView using findNavController

I'm using Android Navigation Component with bottom navigation, lint gives a warning about replacing the <fragment> tag with <FragmentContainerView> but when i replaced, findNavController is not working it gives me error about it does not have a NavController set on

Fragment

<androidx.fragment.app.FragmentContainerView             android:id="@+id/nav_host_fragment"             android:name="androidx.navigation.fragment.NavHostFragment"             android:layout_width="match_parent"             android:layout_height="match_parent"             app:defaultNavHost="true"             app:navGraph="@navigation/mobile_navigation" /> 

Activity

val navController = findNavController(R.id.nav_host_fragment)          val appBarConfiguration = AppBarConfiguration(         setOf(             R.id.navigation_classes, R.id.navigation_schedule, R.id.navigation_settings         )     )     setupActionBarWithNavController(navController, appBarConfiguration)     navView.setupWithNavController(navController) } 
like image 694
Jimale Abdi Avatar asked Dec 10 '19 20:12

Jimale Abdi


People also ask

What is FragmentContainerView?

FragmentContainerView is a customized Layout designed specifically for Fragments. It extends FrameLayout , so it can reliably handle Fragment Transactions, and it also has additional features to coordinate with fragment behavior.

Can we use navigation component for activities?

Note: If your app uses multiple activities, each activity uses a separate navigation graph. To take full advantage of the Navigation component, your app should use multiple fragments in a single activity. However, activities can still benefit from the Navigation component.


1 Answers

As per this issue, when using FragmentContainerView, you need to find the NavController using findFragmentById() rather than using findNavController() when in onCreate():

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

This is because findNavController(R.id.nav_host_fragment) relies on the Fragment's View to already be created which isn't the case when using FragmentContainerView (as it uses a FragmentTransaction under the hood to add the NavHostFragment).

If you are using Fragment 1.4.0 or higher and View Binding, you can simply this considerably by using the getFragment() method:

val navController = binding.container.getFragment<NavHostFragment>().navController 
like image 145
ianhanniballake Avatar answered Oct 29 '22 00:10

ianhanniballake