Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
Seems like using the
FragmentContainerView
doesn't work right out of the box?
<androidx.fragment.app.FragmentContainerView
class="androidx.navigation.fragment.NavHostFragment"
android:id="@+id/fragment_nav_host"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_app" />
Here's my code using fragment-ktx:1.2.0-rc01
and I'm just always getting this error:
Caused by: java.lang.IllegalStateException: Activity ...MainActivity@797467d does not have a NavController set on 2131296504
Just using <fragment>
works and AFAIK, it's just supposed to be replaced by FragmentContainerView
.
Am I missing something or was anyone able to use FragmentContainerView
as a NavHostFragment
?
Many thanks!
Due to this bug-report:
https://issuetracker.google.com/issues/142847973
This is the only way (currently):
val navHostFragment = supportFragmentManager
.findFragmentById(R.id.my_nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
(Java):
NavHostFragment navHostFragment =
(NavHostFragment) getSupportFragmentManager()
.findFragmentById(R.id.my_nav_host_fragment);
NavController navController = navHostFragment.getNavController();
–
–
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:
NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment);
NavController navController = 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.
–
// Set up navigation - action bar and sidebar.
/// Let the navigation view check/uncheck the menu items.
nav_view.post { // wait for NavHostFragment to inflate
val navController = findNavController()
nav_view.setupWithNavController(navController)
nav_view.setNavigationItemSelectedListener(this)
Java8 (with lambda):
navigationView.post(() -> { // wait for NavHostFragment to inflate
navController = Navigation.findNavController(activity, R.id.nav_host_fragment);
NavigationUI.setupWithNavController(navView, navController);
navView.setNavigationItemSelectedListener(navItemSelectedListener);
–
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)
<androidx.fragment.app.FragmentContainerView
android:name="androidx.navigation.fragment.NavHostFragment"
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.