android - 如何在包中将数据类作为 Parcelable 传递?
问题描述
我有一个像这样的密封类:
sealed class SealedClass {
object Object1 : SealedClass()
object Object2 : SealedClass()
object Object3 : SealedClass()
data class DataClass(val sealedClass: SealedClass, val anotherDataType: AnotherDataType? = null)
}
我想在 Bundle 中传递我的数据类,就像我们通常将值传递给一个新片段一样:
@JvmStatic
fun newInstance(dataClass: DataClass): Fragment {
val fragment = Fragment()
val args = Bundle(1)
args.putParcelable("DATA_CLASS", dataClass)
fragment.arguments = args
return fragment
}
我不知道该怎么做。到目前为止,我所读到的是人们使用@Parcelize
注释,这是我试图避免的 Kotlin 的一个实验性功能。另一种方法是通过 Parcelable 扩展数据类并实现 Parcelable 方法,但由于我使用自定义类作为 DataClass 中的参数(例如 SealedClass),我不知道如何在 Parcelable 实现中读取/写入这些值。这不是一个正确的方法吗?
解决方案
我认为现在使用最近使用Parcelable的 Kotlin 可以更简单:
@Parcelize
data class TimeSeries(
val sourceInfo: SourceInfo? = null,
val variable: Variable? = null,
val values: List<Value_>? = null,
val name: String? = null
) : Parcelable
然后在你的包中传递它:
val intent = Intent(context, DetailsActivity::class.java).apply {
putExtra(MY_DATA, mydata[position])
}
context.startActivity(intent)
然后通过你的包把它带进来:
mydata = intent?.getParcelableExtra<TimeSeries>(MY_DATA)
如果您想传递 a Bundle
,您也可以bundleOf(MY_DATA to mydata[position])
在放置 Extra 时使用它,并intent?.getBundleExtra(MY_DATA)?.getParcelable<TimeSeries>(MY_DATA)
在获取它时使用它,但看起来像添加另一层。
推荐阅读
- f# - 如何在 F# 的同一行上获取 Json 元素的字符串值
- r - R合并两个不同长度的数据帧,重复较短的行,直到第一个值发生变化
- google-chrome - Chrome 和网络串行 API。如何在不询问的情况下获得端口
- peewee - 具有多个连接和多个计数的 Peewee 选择查询
- powershell - 我们可以在部署时阻止 Azure LogicApp 触发器触发吗
- azure - Azure DevOps 团队日历缺少一天休假的用户
- javascript - 拼接方法不正确
- c++ - 带字节序的 bit_cast 是否足以避免未定义的行为?
- python - 如何在python中使用正则表达式捕获千位和小数分隔符的价格
- iphone - IOS15 升级后 Iframe 内容未加载到 Iphone 中