FragmentContainerView en tant que NavHostFragment

20

On dirait que l'utilisation du FragmentContainerViewne fonctionne pas dès la sortie de la boîte?

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

Voici mon code à l'aide fragment-ktx:1.2.0-rc01et je reçois toujours cette erreur:

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

En utilisant simplement des <fragment>œuvres et AFAIK, il est juste censé être remplacé par FragmentContainerView.

Suis-je en train de manquer quelque chose ou est-ce que quelqu'un a pu l'utiliser FragmentContainerViewcomme NavHostFragment?

Merci beaucoup!

Kurt Acosta
la source

Réponses:

27

En raison de ce rapport de bogue: https://issuetracker.google.com/issues/142847973

Le seul moyen (actuellement) est de le faire:

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();
Ove Stoerholt
la source
2
sûrement mieux d'utiliser simplement fragmentplutôt que de se soucier d'avoir à se rappeler d'utiliser cette solution de contournement? On voyait des plantages mais seulement pour certains utilisateurs, bizarre ...
hmac
0

Ce que j'ai fait, c'est d'attendre que le fragment de navigation gonfle sa vue:

    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)
    }
Pnémonique
la source
-6

en utilisant android:nameau lieu de class. travaux.

<androidx.fragment.app.FragmentContainerView
    android:name="androidx.navigation.fragment.NavHostFragment"
    ...
chihara
la source
Je reçois l'erreur même lors de l'utilisationandroid:name
Sam