Gau*_*tam 5 inheritance android parcelable kotlin
我正在尝试解决一个问题,但找不到任何特定的解决方案。
基类
open class FeedBase() : Parcelable{
var type : String =""
constructor(parcel: Parcel) : this() {
type=parcel.readString()
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(type)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR: Parcelable.Creator<FeedBase> {
override fun createFromParcel(parcel: Parcel): FeedBase {
return FeedBase(parcel)
}
override fun newArray(size: Int): Array<FeedBase?> {
return arrayOfNulls(size)
}
}}
Run Code Online (Sandbox Code Playgroud)
项目类持有数据类并扩展基类
@Parcelize
data class FeedItem(var feed:Feed) : FeedBase()
Run Code Online (Sandbox Code Playgroud)
& 数据类
@Parcelize
data class Feed(var test:String,var score:Int) : Parcelable
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试跨活动发送数据,并且正在创建我的对象,如下所示
val feedItem = FeedItem(Feed("yolo", 1000))
feedItem.type="test"
Run Code Online (Sandbox Code Playgroud)
但我无法获得正确的类型(基类中的 var )。每当我从另一个活动中的可分包意图接收对象时,它就会变空,但项目数据会被保留。我该如何解决这个问题?
所以它不知道type。在 生成的代码中@Parcelize,基本上有
companion object CREATOR: Parcelable.Creator<FeedItem> {
override fun createFromParcel(parcel: Parcel): FeedItem{
val feed = Feed.CREATOR.createFromParcel(parcel)
return FeedItem(feed)
}
}
Run Code Online (Sandbox Code Playgroud)
请注意, 的FeedBase实现Parcelable并不重要。如果你想一想,它就不能被使用:如果你有
val feedBase = FeedBase.CREATOR.createFromParcel(parcel)
Run Code Online (Sandbox Code Playgroud)
没有办法把这个FeedBase实例变成一个FeedItem实例。
您需要通过Parceler在伴生对象中实现来为这种情况编写自定义逻辑。
| 归档时间: |
|
| 查看次数: |
2435 次 |
| 最近记录: |