104

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!

5 Answers 5

152

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();
Sign up to request clarification or add additional context in comments.

4 Comments

surely better just to use fragmentrather than worrying about having to remember to use this workaround? We were seeing crashes but only for some users, weird...
@hmac In the issue linked they discuss why you shouldn't use fragment: issuetracker.google.com/issues/142847973#comment15: The Lint check is there exactly because you absolutely should switch over to FragmentContainerView in all cases.
does not show anything. It's weird I am stuck with using <fragment>!
what we have to do with navController, because the variable is unused
51

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.

1 Comment

While the original task was tagged as "Won't Fix (Infeasible)", they did link to another task so they might plan to fix the issue after all: issuetracker.google.com/issues/143145612
10

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 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);
});

1 Comment

I had used <fragment> to avoid the bug. But I was troubled another unknown error. So I found this @Pnemonic's late answer and tried it in order to use <FragmentContainerView>. The problem has been cleared, thank you!
3

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)

Comments

-7

using android:name instead of class. works.

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

1 Comment

This answer worked for me. As the docs states: FragmentContainerView can also be used to add a Fragment by using the android:name attribute. developer.android.com/reference/androidx/fragment/app/…

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.