一个参数如何传递给嵌套的导航体系结构组件图?
假设我构建了导航图以从FragmentA --> Nested
导航,其中Nested
包含FragmentB --> FragmentC
...
如果这是一个纯FragmentA --> FragmentB...
图,我将使用FragmentADirections.actionFragmentAToFragmentB(argument = foo)
设置导航。但是,一旦您将B --> C
变成Nested
...
那我该怎么办?
答案 0 :(得分:3)
全球行动可能是一个办法,但我想我一次提取的嵌套图表自己的我没有得到这样的工作.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
动作
答案 1 :(得分:0)
为此使用全局操作,并传递参数。
<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/mobile_navigation"
app:startDestination="@id/mainFragment">
<activity android:id="@+id/playbackActivity"
android:name="com.cinderellaman.general.ui.activities.PlaybackActivity"
android:label="activity_playback"
tools:layout="@layout/activity_playback">
<argument android:name="videoId"
app:nullable="true"/>
<argument android:name="position"
app:argType="integer"
android:defaultValue="1"/>
</activity>
<action android:id="@+id/action_global_playbackActivity"
app:destination="@id/playbackActivity"/></navigation>
答案 2 :(得分:0)
如果您不想为嵌套图创建单独的xml,则可以以android开发者says here的方式在操作中覆盖目标参数。我只是测试它是否可与导航图视图模型范围一起使用,并且运行良好。我正在使用导航组件的Version 2.2.0-alpha03。将这些参数添加到操作 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>
答案 3 :(得分:0)
实际上,这很简单,您只需要在nested_nav中添加参数即可 例如
<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">
</action>
</fragment>
<navigation
android:id="@+id/nested_graph"
app:startDestination="@id/fragmentB"
...>
<argument
android:name="foo"
app:argType="integer"/>
<fragment
android:id="@+id/fragmentB"
...>
<argument
android:name="foo"
app:argType="integer"/>
<action
... // navigation action to FragmentC />
</fragment>
<fragment ... // FragmentC stuff
</navigation>
</navigation>
或者您可以捆绑发送数据