在Android中编写自定义视图以在配置更改时保持其状态是繁琐的,仅为保存一个字段的状态而编写大量样板代码:
private class SavedState : BaseSavedState {
var amount: Int = 0
constructor(parcel: Parcel) : super(parcel) {
amount = parcel.readInt()
}
constructor (parcelable: Parcelable?) : super(parcelable)
override fun writeToParcel(parcel: Parcel, flags: Int) {
super.writeToParcel(parcel, flags)
parcel.writeInt(amount)
}
companion object CREATOR : Parcelable.Creator<SavedState> {
override fun createFromParcel(parcel: Parcel): SavedState {
return SavedState(parcel)
}
override fun newArray(size: Int): Array<SavedState?> {
return arrayOfNulls(size)
}
}
}
Android Extensions插件提供了@Parcelize
注释,可以用于自动生成Parcelable
实现,但对于自定义视图,我们必须从BaseSavedState
扩展,而不是直接从Parcelable
扩展。
因此,像这样的代码无法编译:
@Parcelize
data class SavedState(val isLoading: Boolean = false): BaseSavedState()
我想知道是否有一种更简洁的方式来处理自定义视图中的状态恢复。 欢迎任何想法或建议。
Parcelable
是一个接口,你不能从它继承,而是要实现它。"像这样拥有东西是无法编译的" -- 尝试用BaseSavedState(), Parcelable
替换BaseSavedState()
。@Parcelize
可能仍然存在问题,但原则上应该没问题。 - CommonsWareBaseSavedState(parcel)
实际上需要一个类型为Parcel
的参数。 - Andy Res@Parcelize
将这些状态放入一个data
类中。然后,你的自定义SavedState
基本上就是你在第一个片段中所拥有的,只需用writeParcelable()
和readParcelable()
替换writeInt()
和readInt()
来写入/读取你的data
类实例即可。 - CommonsWare@Parcelize
的东西 - 我没有查看是否有人已经这样做了。 - CommonsWare