web-dev-qa-db-fra.com

<androidx.fragment.app.FragmentContainerView> vs <fragment> comme vue pour un NavHost

Lors de l'utilisation de androidx.fragment.app.FragmentContainerView en tant que navHost au lieu d'une application régulière fragment n'est pas en mesure de naviguer vers une destination après un changement d'orientation.

J'obtiens une erreur suivante: Java.lang.IllegalStateException: no current navigation node

Y a-t-il un problème que je devrais connaître pour l'utiliser correctement ou ma façon d'utiliser les composants de navigation est-elle incorrecte?

Activité simple xml avec une vue:


...
    <androidx.fragment.app.FragmentContainerView
        Android:id="@+id/nav_Host_fragment"
        Android:name="androidx.navigation.fragment.NavHostFragment"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        app:navGraph="@navigation/nav_simple" />
...

Code de navigation:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/nav_legislator.xml"
    app:startDestination="@id/initialFragment">

    <fragment
        Android:id="@+id/initialFragment"
        Android:name="com.example.fragmenttag.InitialFragment"
        Android:label="Initial Fragment"
        tools:layout="@layout/initial_fragment">
        <action
            Android:id="@+id/action_initialFragment_to_destinationFragment"
            app:destination="@id/destinationFragment" />
    </fragment>
    <fragment
        Android:id="@+id/destinationFragment"
        Android:name="com.example.fragmenttag.DestinationFragment"
        Android:label="Destination Fragment"
        tools:layout="@layout/destination_fragment" />

</navigation>

Voici un dépôt github où vous pouvez facilement reproduire un bug: https://github.com/dmytroKarataiev/navHostBug

9
Dmytro Karataiev

L'erreur no current navigation node Se produit lorsqu'il n'y a pas de jeu de graphes et que vous essayez d'appeler navigate(). Si cela ne se produit que lorsque vous utilisez FragmentContainerView et après un changement de configuration, cela serait lié à ce bogue , qui est corrigé et dont la sortie est prévue avec Navigation 2.2.0- rc03.

Pour contourner ce problème, vous pouvez revenir à <fragment> Ou supprimer app:navGraph="@navigation/nav_simple" Et appeler à la place navController.setGraph(R.navigation.nav_simple).

18
ianhanniballake