FragmentContainerView using findNavController
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 NavHostFragmentval 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
).
Replace this line:
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
with
NavController navController = getNavController();
Where getNavController()
looks like this:
// workaround for https://issuetracker.google.com/issues/142847973 @NonNull private NavController getNavController() { Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment); if (!(fragment instanceof NavHostFragment)) { throw new IllegalStateException("Activity " + this + " does not have a NavHostFragment"); } return ((NavHostFragment) fragment).getNavController(); }
On top of the accepted answer, a little shortcut what could be used is:
supportFragmentManager.findFragmentById(R.id.navHostMain)?.findNavController()
Regards