gpt4 book ai didi

android - 有没有一种优雅的方式来保存和恢复 Kotlin 中的 View 状态?

转载 作者:行者123 更新时间:2023-12-02 11:49:37 25 4
gpt4 key购买 nike

编写自定义 View 以在 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 的实现的注释,但在自定义 View 的情况下,我们必须从 BaseSavedState 扩展不是直接来自 Parcelable .

所以,有这样的东西不会编译:
@Parcelize
data class SavedState(val isLoading: Boolean = false): BaseSavedState()

我想知道在自定义 View 中是否有一种不那么冗长的方式来处理状态恢复。将不胜感激任何想法或建议。

最佳答案

写一个SaveState class 是一种方法,它将所有需要保存的数据打包到一个类中。另一种方法是直接覆盖 onSaveInstanceStateonRestoreInstanceState把你的论点放在一个包里。这避免了你提到的样板。如果您有多个参数,只需使用带有 @Parcelize 的数据类使用 bundle.putParcelable 注释并保存该类.(而不是本例中的金额)。也不要忘记设置isSaveEnabled为真。

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)
}

关于android - 有没有一种优雅的方式来保存和恢复 Kotlin 中的 View 状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57310783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com