Skip to content Skip to sidebar Skip to footer

Fragmentcontainerview As Navhostfragment

Seems like using the FragmentContainerView doesn't work right out of the box? Copy

(Java):

NavHostFragmentnavHostFragment=
    (NavHostFragment) getSupportFragmentManager()
        .findFragmentById(R.id.my_nav_host_fragment);
NavControllernavController= navHostFragment.getNavController();

Solution 2:

August 2020 update

Here is the solution recommended by the official Android documentation.

Kotlin version:

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

Java version:

NavHostFragmentnavHostFragment= supportFragmentManager.findFragmentById(R.id.nav_host_fragment);
NavControllernavController= navHostFragment.getNavController();

I quote the doc:

When creating the NavHostFragment using FragmentContainerView or if manually adding the NavHostFragment to your activity via a FragmentTransaction, attempting to retrieve the NavController in onCreate() of an Activity via Navigation.findNavController(Activity, @IdRes int) will fail. You should retrieve the NavController directly from the NavHostFragment instead.


The bug-report reported by Ove Stoerholt will not be fixed. You can see here the "Won't Fix (Infeasible)" status.

Solution 3:

What I did was to wait for the NavHostFragment to inflate its view:

Kotlin:

super.onCreate(savedInstanceState)

// Set up the form and list.
setContentView(R.layout.activity_xxx)

// Set up navigation - action bar and sidebar./// Let the navigation view check/uncheck the menu items.
nav_view.post { // wait for NavHostFragment to inflateval navController = findNavController()
    nav_view.setupWithNavController(navController)
    nav_view.setNavigationItemSelectedListener(this)
}

Java8 (with lambda):

navigationView.post(() -> { //waitfor NavHostFragment to inflate
    navController = Navigation.findNavController(activity, R.id.nav_host_fragment);
    NavigationUI.setupWithNavController(navView, navController);
    navView.setNavigationItemSelectedListener(navItemSelectedListener);
});

Solution 4:

I have the same problem when using kotlin:

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

val navController = navHostFragment.navController

Just add it to

setupActionBarWithNavController(navController)

Solution 5:

using android:name instead of class. works.

<androidx.fragment.app.FragmentContainerView
    android:name="androidx.navigation.fragment.NavHostFragment"
    ...

Post a Comment for "Fragmentcontainerview As Navhostfragment"