Comment passe-t-on des arguments à un graphe de composant d'architecture de navigation imbriqué?
Disons que je construis mon graphique de navigation pour naviguer à partir de FragmentA --> Nested
, Où Nested
contient FragmentB --> FragmentC
...
S'il s'agissait d'un pur graphique FragmentA --> FragmentB...
, Je configurerais simplement la navigation avec FragmentADirections.actionFragmentAToFragmentB(argument = foo)
. Mais cette action ne prend aucun argument dès que vous transformez B --> C
En Nested
...
Alors, que suis-je censé faire?
Les actions globales pourraient être un moyen, mais je n'ai pas réussi à le faire fonctionner comme je le souhaitais une fois que j'ai extrait le graphique imbriqué dans son propre .xml
. Mais cela s'est avéré être embarrassant, il suffit d'ajouter les arguments manuellement dans le code à votre action.
Un exemple lié à la question serait:
Enregistrez le graphique imbriqué dans nested_graph.xml
, il ressemblera à quelque chose
<navigation
Android:id="@+id/nested_graph"
app:startDestination="@id/fragmentB"
...>
<fragment
Android:id="@+id/fragmentB"
...>
<argument
Android:name="foo"
app:argType="integer"/>
<action
... // navigation action to FragmentC />
</fragment>
<fragment ... // FragmentC stuff
</navigation>
Pour passer des arguments à nested_graph.xml
à partir d'un autre graphique, par exemple root_graph.xml
faire
<navigation
Android:id="@+id/root_graph"
app:startDestination="@id/fragmentA"
...>
<fragment
Android:id="@+id/fragmentA"
... >
<action
Android:id="@+id/action_fragmentA_to_nested_graph"
app:destination="@id/nested_graph">
<argument
Android:name="foo"
app:argType="integer"/>
</action>
</fragment>
<include app:graph="@navigation/nested_graph"/>
</navigation>
En d'autres termes, ajoutez simplement le même <argument ... />
à la root_graph
l'action que vous attendez de recevoir dans le nested_graph
.
Si vous ne voulez pas créer un xml séparé pour le graphique imbriqué, vous pouvez remplacer l'argument de destination dans une action comme Android développeurs dit ici . Je le teste juste pour l'utiliser avec la portée du modèle de vue du graphique de navigation et cela a parfaitement fonctionné. J'utilise Version 2.2.0-alpha du composant de navigation. Après avoir ajouté ces paramètres à l'action action_inboxFragment_to_conversation_graph, maintenant InboxFragmentDirections.ActionInboxFragmentToConversationGraph est généré correctement.
<?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/messages_graph"
app:startDestination="@id/inboxFragment">
<fragment
Android:id="@+id/inboxFragment"
Android:name="com.wlpr.docfinder.ui.fragment.InboxFragment"
Android:label="fragment_inbox"
tools:layout="@layout/fragment_inbox" >
<action
Android:id="@+id/action_inboxFragment_to_conversation_graph"
app:destination="@id/conversation_graph">
<argument
Android:name="participantName"
Android:defaultValue="Conversation"
app:argType="string"
app:nullable="true" />
<argument
Android:name="documentsCount"
Android:defaultValue="1"
app:argType="integer" />
</action>
</fragment>
<navigation
Android:id="@+id/conversation_graph"
Android:label="conversationGraph"
app:startDestination="@id/conversationFragment">
<fragment
Android:id="@+id/conversationFragment"
Android:name="com.wlpr.docfinder.ui.fragment.ConversationFragment"
Android:label="fragment_conversation"
tools:layout="@layout/fragment_conversation">
<action
Android:id="@+id/action_conversationFragment_to_reportingDetailsFragment"
app:destination="@id/reportingDetailsFragment" />
<argument
Android:name="participantName"
Android:defaultValue="Conversation"
app:argType="string"
app:nullable="true" />
<argument
Android:name="documentsCount"
Android:defaultValue="1"
app:argType="integer" />
</fragment>
<!-------- more fragments... -------->
</navigation>