Fragmentcontainerview As Navhostfragment
(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"