web-dev-qa-db-fra.com

Passer des arguments à un graphique de composant d'architecture de navigation imbriqué

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?

16
Algar

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.

25
Algar

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>
0
wilmerlpr