ネストされたナビゲーションアーキテクチャコンポーネントグラフに引数を渡すにはどうすればよいですか?
_FragmentA --> Nested
_から移動するナビゲーショングラフを作成するとします。ここで、Nested
には_FragmentB --> FragmentC
_...が含まれています。
これが純粋な_FragmentA --> FragmentB...
_グラフであれば、FragmentADirections.actionFragmentAToFragmentB(argument = foo)
を使用してナビゲーションを設定します。しかし、そのアクションは、_B --> C
_をNested
...に変換するとすぐに引数を取りません。
それで、私は何をすべきですか?
グローバルアクションが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_graph
をnested_graph
アクションに追加するだけです。
ネストされたグラフの個別の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>