FragmentContainerView using findNavController FragmentContainerView using findNavController android android

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