编写自定义视图以在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
扩展而不能直接从{{ 1}}。
因此,具有这样的内容无法编译:
Parcelable
我想知道是否在自定义视图中没有那么冗长的方式来处理状态恢复。将不胜感激任何想法或建议。
答案 0 :(得分:1)
编写SaveState
类是这样做的一种方法,它将需要保存的所有数据打包到一个类中。另一种方法是仅覆盖onSaveInstanceState
和onRestoreInstanceState
并将您的参数放在一个包中。这避免了您提到的样板。如果您有多个参数,只需使用带有@Parcelize
批注的数据类并使用bundle.putParcelable
保存该类。(而不是本示例中的数量)。也不要忘记将isSaveEnabled
设置为true。
init { isSaveEnabled = true }
...
override fun onSaveInstanceState(): Parcelable {
val bundle = Bundle()
bundle.putInt("amount", amount)
bundle.putParcelable("superState", super.onSaveInstanceState())
return bundle
}
override fun onRestoreInstanceState(state: Parcelable) {
var viewState = state
if (viewState is Bundle) {
amount = viewState.getInt("amount", 0)
viewState = viewState.getParcelable("superState")
}
super.onRestoreInstanceState(viewState)
}