web-dev-qa-db-ja.com

ネストされたナビゲーションアーキテクチャコンポーネントグラフに引数を渡す

ネストされたナビゲーションアーキテクチャコンポーネントグラフに引数を渡すにはどうすればよいですか?

_FragmentA --> Nested_から移動するナビゲーショングラフを作成するとします。ここで、Nestedには_FragmentB --> FragmentC_...が含まれています。

これが純粋な_FragmentA --> FragmentB..._グラフであれば、FragmentADirections.actionFragmentAToFragmentB(argument = foo)を使用してナビゲーションを設定します。しかし、そのアクションは、_B --> C_をNested...に変換するとすぐに引数を取りません。

それで、私は何をすべきですか?

16
Algar

グローバルアクションが1つの方法である可能性がありますが、ネストされたグラフを独自の.xmlに抽出すると、期待どおりに機能しませんでした。しかし、それは恥ずかしいほど単純であることがわかりました-コードに手動で引数をアクションに追加するだけです。

質問に関連する例は次のとおりです。

ネストされたグラフをnested_graph.xmlに保存すると、次のようになります

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

別のグラフからnested_graph.xmlに引数を渡すには、root_graph.xmlと言います。

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

言い換えると、<argument ... />で受け取ると予想されるのと同じroot_graphnested_graphアクションに追加するだけです。

25
Algar

ネストされたグラフの個別のxmlを作成したくない場合は、アクションの宛先引数をAndroid開発者 ここで言う としてオーバーライドできます。使用するためにテストするだけです。ナビゲーショングラフビューモデルスコープで、それは完全に機能しました。ナビゲーションコンポーネントの バージョン2.2.0-alpha を使用しています。アクションにこれらのパラメーターを追加した後action_inboxFragment_to_conversation_graph、InboxFragmentDirections.ActionInboxFragmentToConversationGraphが正しく生成されるようになりました。

<?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