如何通过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
相关产品推荐
相关产品推荐

