You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Navigation Component的Fragment参数传递任意类型的泛型列表

实现方案

你可以通过以下两种常用方式实现任意Parcelable类型列表的参数传递和接收:

方案1:不依赖Safe Args,直接通过Bundle操作

这种方式最贴近你之前在Activity中传参的习惯,不需要额外配置导航图参数:

  • 传递参数时直接使用你现有写法即可,注意所有列表元素必须实现Parcelable接口:
val bundle = bundleOf("listItems" to (list as ArrayList<out Parcelable>))
findNavController().navigate(R.id.action_target_fragment, bundle)
  • 目标Fragment中接收参数的写法和Activity中几乎一致:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val listItems = arguments?.getParcelableArrayList<Parcelable>("listItems")
    // 拿到后根据业务场景强转为对应类型使用即可
}

方案2:配合Safe Args插件使用

如果你的项目启用了Navigation Safe Args插件,可以先在导航图中配置目标Fragment的参数:

<fragment
    android:id="@+id/target_fragment"
    android:name="com.xxx.YourTargetFragment">
    <argument
        android:name="listItems"
        app:argType="android.os.Parcelable[]"
        app:isNullable="true"
        android:defaultValue="@null" />
</fragment>

如果需要明确是ArrayList类型,可以改成:

<argument
    android:name="listItems"
    app:argType="java.util.ArrayList"
    app:isNullable="true"
    android:defaultValue="@null" />
  • 传递参数时可以直接使用生成的Safe Args类构造参数:
val direction = YourTargetFragmentDirections.actionTargetFragment(list = list as ArrayList<out Parcelable>)
findNavController().navigate(direction)
  • 接收参数时直接通过navArgs委托拿取:
private val args by navArgs<YourTargetFragmentArgs>()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val listItems = args.listItems
}

注意事项:Bundle传参总大小不能超过1MB,如果你传递的列表数据量较大,建议改用共享ViewModel、本地持久化等方式传递,避免触发TransactionTooLargeException异常。

内容的提问来源于stack exchange,提问作者JPM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 03:15:09