如何在捆绑包中将数据 class 作为 Parcelable 传递?
How to pass data class as Parcelable in a bundle?
我有一个密封的class像这样:
sealed class SealedClass {
object Object1 : SealedClass()
object Object2 : SealedClass()
object Object3 : SealedClass()
data class DataClass(val sealedClass: SealedClass, val anotherDataType: AnotherDataType? = null)
}
我想在 Bundle 中传递我的数据 class,就像我们通常将值传递给新片段一样:
@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 扩展数据 class 并实现 Parcelable 方法,但是由于我使用自定义 classes 作为 DataClass 中的参数(例如,SealedClass),我不知道如何read/write Parcelable 实现中的那些值。这不是正确的做法吗?
在使用反射并导致更多垃圾收集的同时可序列化更容易实现。
我发现使用 GSON 最简单。
https://github.com/google/gson
首先,将其添加到您的数据中 class,如下所示:
data class TimeSeries(
@SerializedName("sourceInfo")
val sourceInfo: SourceInfo? = null,
@SerializedName("variable")
val variable: Variable? = null,
@SerializedName("values")
val values: List<Value_>? = null,
@SerializedName("name")
val name: String? = null
) : Serializable
然后将其传递到您的包中:
val intent = Intent(context, DetailsActivity::class.java).apply {
putExtra(MY_DATA, Gson().toJson(mydata[position]))
}
context.startActivity(intent)
然后通过您的包裹将其带入:
mydata = Gson().fromJson(intent?.extras?.getString(MY_DATA), TimeSeries::class.java)
我认为现在使用最近的 Kotlin 可以更简单 Parcelable:
@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)
如果您想传递一个 Bundle
,您也可以在放置 Extra 时使用 bundleOf(MY_DATA to mydata[position])
,在获取它时使用 intent?.getBundleExtra(MY_DATA)?.getParcelable<TimeSeries>(MY_DATA)
,但看起来像是添加另一层。
如果您想将密封的 class 转换为可打包的,您可以执行以下操作:
sealed class SealedClass : Parcelable {
@Parcelize
object Object1 : SealedClass()
@Parcelize
object Object2 : SealedClass()
@Parcelize
object Object3 : SealedClass()
@Parcelize
data class DataClass(val sealedClass: SealedClass, val anotherDataType: AnotherDataType? = null) : SealedClass()
}
我有一个密封的class像这样:
sealed class SealedClass {
object Object1 : SealedClass()
object Object2 : SealedClass()
object Object3 : SealedClass()
data class DataClass(val sealedClass: SealedClass, val anotherDataType: AnotherDataType? = null)
}
我想在 Bundle 中传递我的数据 class,就像我们通常将值传递给新片段一样:
@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 扩展数据 class 并实现 Parcelable 方法,但是由于我使用自定义 classes 作为 DataClass 中的参数(例如,SealedClass),我不知道如何read/write Parcelable 实现中的那些值。这不是正确的做法吗?
在使用反射并导致更多垃圾收集的同时可序列化更容易实现。
我发现使用 GSON 最简单。 https://github.com/google/gson
首先,将其添加到您的数据中 class,如下所示:
data class TimeSeries(
@SerializedName("sourceInfo")
val sourceInfo: SourceInfo? = null,
@SerializedName("variable")
val variable: Variable? = null,
@SerializedName("values")
val values: List<Value_>? = null,
@SerializedName("name")
val name: String? = null
) : Serializable
然后将其传递到您的包中:
val intent = Intent(context, DetailsActivity::class.java).apply {
putExtra(MY_DATA, Gson().toJson(mydata[position]))
}
context.startActivity(intent)
然后通过您的包裹将其带入:
mydata = Gson().fromJson(intent?.extras?.getString(MY_DATA), TimeSeries::class.java)
我认为现在使用最近的 Kotlin 可以更简单 Parcelable:
@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)
如果您想传递一个 Bundle
,您也可以在放置 Extra 时使用 bundleOf(MY_DATA to mydata[position])
,在获取它时使用 intent?.getBundleExtra(MY_DATA)?.getParcelable<TimeSeries>(MY_DATA)
,但看起来像是添加另一层。
如果您想将密封的 class 转换为可打包的,您可以执行以下操作:
sealed class SealedClass : Parcelable {
@Parcelize
object Object1 : SealedClass()
@Parcelize
object Object2 : SealedClass()
@Parcelize
object Object3 : SealedClass()
@Parcelize
data class DataClass(val sealedClass: SealedClass, val anotherDataType: AnotherDataType? = null) : SealedClass()
}