FragmentContainerView як 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/isissue/142847973

Єдиний спосіб (наразі) - це досягти:

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

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


-6

використовуючи android:nameзамість class. працює.

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

Я отримую помилку навіть при використанніandroid:name
Сем
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.