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

Fra*_*cis 4 navigation android android-jetpack android-architecture-navigation

safe-args在操作中使用导航(带有Directions类)时,传递它非常容易。但是safe-args在使用导航直接分段的情况下如何通过?

navController?.navigate(R.id.detailFragment)
Run Code Online (Sandbox Code Playgroud)

导航图:

<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>
Run Code Online (Sandbox Code Playgroud)

XII*_*-th 7

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

该库将构建参数的类MyDestinationArgs。您可以使用它来构建Bundle结果并将结果传递到目的地

val args = DetailFragmentArgs.Builder("template_code").build().toBundle()
navController?.navigate(R.id.confirmationAction, args) 
Run Code Online (Sandbox Code Playgroud)

在接收方,您也可以使用arguments类检索数据

val templateCode = SecondFragmentArgs.fromBundle(arguments).templateCode
Run Code Online (Sandbox Code Playgroud)

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

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

const val ARG_TEMPLATE_CODE = "templateCode"
Run Code Online (Sandbox Code Playgroud)

常数companion objectDetailFragmentstatic final Java字段)

现在您可以传递数据

val args = Bundle()
args.putString(DetailFragment.ARG_TEMPLATE_CODE, "some_code")
navController?.navigate(R.id.confirmationAction, args)
Run Code Online (Sandbox Code Playgroud)

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

arguments?.getString(ARG_TEMPLATE_CODE)
Run Code Online (Sandbox Code Playgroud)

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

intent?.extras?.getString(ARG_TEMPLATE_CODE)
Run Code Online (Sandbox Code Playgroud)

此处此处阅读文档中的更多内容