FragmentContainerПросмотреть как NavHostFragment

20

Кажется, что использование FragmentContainerViewне работает прямо из коробки?

<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" />

Вот мой код, fragment-ktx:1.2.0-rc01и я всегда получаю эту ошибку:

Caused by: java.lang.IllegalStateException: Activity ...MainActivity@797467d does not have a NavController set on 2131296504

Просто с помощью <fragment>работ и AFAIK, он просто должен быть заменен FragmentContainerView.

Я что-то упустил или кто-то смог использовать FragmentContainerViewкак NavHostFragment?

Большое спасибо!

Курт Акоста
источник

Ответы:

27

Из-за этого сообщения об ошибке: https://issuetracker.google.com/issues/142847973

Единственный способ (в настоящее время) заключается в следующем:

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

(Ява):

NavHostFragment navHostFragment =
    (NavHostFragment) getSupportFragmentManager()
        .findFragmentById(R.id.my_nav_host_fragment);
NavController navController = navHostFragment.getNavController();
Ove Stoerholt
источник
2
конечно, лучше просто использовать, fragmentа не беспокоиться о том, чтобы не забыть использовать этот обходной путь? Мы видели сбои, но только для некоторых пользователей, странно ...
Hmac
0

Что я сделал, так это подождал, пока фрагмент навигации не надулся:

    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)
    }
Pnemonic
источник
-6

используя android:nameвместо class. работает.

<androidx.fragment.app.FragmentContainerView
    android:name="androidx.navigation.fragment.NavHostFragment"
    ...
Chihara
источник
Я получаю ошибку даже при использованииandroid:name
Сэм