如何通过 NavComp 片段参数传递任何类型的通用列表
How to Pass Generic List of Any Type Through NavComp Fragment Args
我正在将项目从许多活动转换为一个 activity 具有许多片段并使用导航组件来执行此操作。有一个 activity 接受大约 10 个所有不同类型的不同列表的多个列表。在为要传递给片段的参数创建参数时,如何为可以是任何类型列表的参数执行此操作?
这是我在 onCreate 中从 activity 中获取它的方法。
intent.getParcelableArrayListExtra<Parcelable>("listItems")
我知道当我将它发送到片段时我将不得不做这样的事情
val bundle = bundleOf("ListItems" to (list as ArrayList<out Parcelable>))
findNavController().navigate(R.id.action, bundle)
safeArgs
只支持自定义parcelable
和自定义数组parcelable
.
我们不能使用导航组件传递通用列表,但我们可以传递 parcelable
的数组,我们可以使用 toTypedArray()
将通用列表转换为数组
在导航图中,将参数类型更改为目标片段中自定义 parceable
的 array
<fragment
android:id="@+id/destinationFragment"
android:name="com.example.destinationFragments"
android:label="destinationFragment"
tools:layout="@layout/fragment_destination" >
<argument
android:name="test"
app:argType="com.example.data.Test[]" />
</fragment>
现在,您可以在将通用列表转换为 TypedArray
后发送它
val action = HomeFragmentDirections.actionHomeFragmentToDestinationFragment(list.toTypedArray())
findNavController().navigate(action)
您可以使用 savedStateHandle
或 bundle
在目标片段中接收此内容
使用bundle
val args: DestinationFragmentArgs by navArgs()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val passesDataArray = args.test //here is your array of custom parcelable
}
所以我最终这样做了。对我来说它有点老套,但只要列表不是很大,它就会一直工作。
binding.button.setOnClickListener {
val bundle = bundleOf("ListItems" to (list as ArrayList<out Parcelable>))
findNavController().navigate(R.id.action_home_to_see_list, bundle)
}
然后在片段中我将此数据传递给我只是这样做
val list = arguments?.getParcelableArrayList<ListItems>("ListItems")?.toList()
对这个解决方案不满意,因为它对我来说很老套,但它确实有效
我正在将项目从许多活动转换为一个 activity 具有许多片段并使用导航组件来执行此操作。有一个 activity 接受大约 10 个所有不同类型的不同列表的多个列表。在为要传递给片段的参数创建参数时,如何为可以是任何类型列表的参数执行此操作?
这是我在 onCreate 中从 activity 中获取它的方法。
intent.getParcelableArrayListExtra<Parcelable>("listItems")
我知道当我将它发送到片段时我将不得不做这样的事情
val bundle = bundleOf("ListItems" to (list as ArrayList<out Parcelable>))
findNavController().navigate(R.id.action, bundle)
safeArgs
只支持自定义parcelable
和自定义数组parcelable
.
我们不能使用导航组件传递通用列表,但我们可以传递 parcelable
的数组,我们可以使用 toTypedArray()
在导航图中,将参数类型更改为目标片段中自定义 parceable
的 array
<fragment
android:id="@+id/destinationFragment"
android:name="com.example.destinationFragments"
android:label="destinationFragment"
tools:layout="@layout/fragment_destination" >
<argument
android:name="test"
app:argType="com.example.data.Test[]" />
</fragment>
现在,您可以在将通用列表转换为 TypedArray
val action = HomeFragmentDirections.actionHomeFragmentToDestinationFragment(list.toTypedArray())
findNavController().navigate(action)
您可以使用 savedStateHandle
或 bundle
使用bundle
val args: DestinationFragmentArgs by navArgs()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val passesDataArray = args.test //here is your array of custom parcelable
}
所以我最终这样做了。对我来说它有点老套,但只要列表不是很大,它就会一直工作。
binding.button.setOnClickListener {
val bundle = bundleOf("ListItems" to (list as ArrayList<out Parcelable>))
findNavController().navigate(R.id.action_home_to_see_list, bundle)
}
然后在片段中我将此数据传递给我只是这样做
val list = arguments?.getParcelableArrayList<ListItems>("ListItems")?.toList()
对这个解决方案不满意,因为它对我来说很老套,但它确实有效