Dans une application que je construis, j'ai utilisé l'architecture à activité unique et j'ai décidé d'utiliser le nouveau composant de navigation de Google pour naviguer dans l'application.
Bien qu'il soit très prometteur, il présente certains inconvénients dont ma question concerne l'un d'entre eux.
Supposons que nous ayons trois fragments qui sont parcourus dans l'ordre, sauf que nous voulons revenir au premier lorsque le bouton de retour est cliqué lorsque nous sommes sur le troisième fragment. Voici comment ça se passe:
<?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/main_nav_graph.xml"
app:startDestination="@id/firstFragment">
<fragment
Android:id="@+id/firstFragment"
Android:name="com.hmomeni.navisample.FirstFragment"
Android:label="fragment_first"
tools:layout="@layout/fragment_first" >
<action
Android:id="@+id/action_firstFragment_to_secondFragment"
app:destination="@id/secondFragment" />
</fragment>
<fragment
Android:id="@+id/secondFragment"
Android:name="com.hmomeni.navisample.SecondFragment"
Android:label="fragment_second"
tools:layout="@layout/fragment_second" >
<action
Android:id="@+id/action_secondFragment_to_thirdFragment"
app:destination="@id/thirdFragment"
app:popUpTo="@+id/firstFragment" />
</fragment>
<fragment
Android:id="@+id/thirdFragment"
Android:name="com.hmomeni.navisample.ThirdFragment"
Android:label="fragment_third"
tools:layout="@layout/fragment_third" />
</navigation>
Le problème ici est que lorsque je veux répéter la navigation pour la deuxième fois, une exception se produit me disant que:
Java.lang.IllegalArgumentException: destination de navigation com.hmomeni.navisample: id/action_firstFragment_to_secondFragment est inconnu de ce NavController
Une enquête plus approfondie montre qu'en appuyant sur le bouton de retour et en revenant au premier fragment, le navController.currentDestination
fait toujours référence au ThirdFragment
qui est incorrect et qui devrait être FirstFragment
.
Toute aide à ce sujet est appréciée.
J'avais un problème similaire à cette question mais avec une navigation circulaire, où la pile arrière n'était pas sautée. Lors de la navigation depuis C -> A, je définissais par erreur le paramètre pour navigate(int resId)
comme R.id.fragmentC
au lieu d'utiliser une action comme
R.id.action_c_to_a
J'ai trouvé une solution de contournement, même si je n'appellerais pas cela une solution.
Pour contourner ce problème, vous pouvez créer une action de ThirdFragment
à elle-même, puis rechercher navController.currentDestination
lorsque la navigation est appelée.
Je n'accepterais pas cette réponse faute d'une vraie solution.