导航到片段时传递安全参数

时间:2018-10-03 08:18:50

标签: android navigation android-jetpack android-architecture-navigation

使用navigation通过一个动作(带有 directions类)时,很容易传递safe-args。 但是,在使用导航直接分段的情况下如何传递safe-args

navController?.navigate(R.id.detailFragment)

导航图:

<fragment
    android:id="@+id/detailFragment"
    android:name="com.example.ui.main.detail.DetailFragment"
    android:label=" "
    tools:layout="@layout/detail_fragment" >
    <argument
        android:name="templateCode"
        app:argType="string" />
    <action
        android:id="@+id/action_start_guide"
        app:destination="@id/fillInfoFragment" />
</fragment>

2 个答案:

答案 0 :(得分:3)

使用类型安全的方法是个好主意,因为它可以带给您编译时安全性和一些便利。

此库将构建自变量的类MyDestinationArgs。您可以使用它来构建Bundle并将结果以这种方式传递到目的地

val args = DetailFragmentArgs.Builder("template_code").build().toBundle()
navController?.navigate(R.id.confirmationAction, args) 

在接收方,您也可以使用参数类

来检索数据
val templateCode = SecondFragmentArgs.fromBundle(arguments).templateCode

如果某些季节我们不能使用 safeargs

我们也可以在Bundle内部传递数据。假设您已添加

const val ARG_TEMPLATE_CODE = "templateCode"

companion object的{​​{1}}中恒定(Java中的DetailFragment字段)

现在您可以传递数据了

static final

接收器片段可以从参数获取数据:

val args = Bundle()
args.putString(DetailFragment.ARG_TEMPLATE_CODE, "some_code")
navController?.navigate(R.id.confirmationAction, args)

或者,如果目标目标是arguments?.getString(ARG_TEMPLATE_CODE) ,则可以从意向附加中获取数据(Activity现在从目标活动中获取常量)

ARG_TEMPLATE_CODE

详细了解文档herehere

答案 1 :(得分:0)

安全的方法是在需要导航到“直接”片段的情况下定义全局操作

<fragment
    android:id="@+id/detailFragment"
    android:name="com.example.ui.main.detail.DetailFragment"
    android:label=" "
    tools:layout="@layout/detail_fragment" >
    <argument
        android:name="templateCode"
        app:argType="string" />
    <action
        android:id="@+id/action_start_guide"
        app:destination="@id/fillInfoFragment" />
</fragment>

<action
    android:id="@+id/action_detail_fragment"
    app:destination="@id/fillInfoFragment" />

然后

findNavController().navigate(NavGraphDirection.actionDetailFragment(templateCode))