我扩展了android.widget.Spinner。并在我的实现中添加了一个int字段。现在我希望它将字段值保存在方向更改上。我的第一个想法是使用Bundle对象:
override fun onSaveInstanceState(): Parcelable {
val bundle = Bundle()
bundle.putParcelable(SUPER_STATE, super.onSaveInstanceState())
bundle.putInt(PREV_ITEM, this.prevItem) // ... save stuff
return bundle
}
override fun onRestoreInstanceState(state: Parcelable?) {
val newState: Parcelable
if (state is Bundle) {
this.prevItem = state.getInt(PREV_ITEM) // ... load stuff
newState = state.getParcelable<Parcelable>(SUPER_STATE)
super.onRestoreInstanceState(newState)
}
super.onRestoreInstanceState(state)
}
但是我收到了一个错误:
java.lang.ClassCastException: android.os.Bundle cannot be cast to android.widget.Spinner$SavedState
所以我找到了Spinner source code并且发现我必须扩展内部静态类SavedState并使用它来保存我的字段值。但我无法做到这一点。 Android Studio建议它“无法解析符号'已保存状态'”。
那么我该如何保存自定义Spinner的状态呢?
答案 0 :(得分:1)
你实际上无法扩展Spinner.SavedState,因为它是在Spinner类中创建的。即使您尝试覆盖Spinner.onSaveInstanceState,也无法在自定义类中实现此方法,因为您无法访问Spinner类的私有变量。
您实际可以做的是创建实现Parcelable的新类,并使用从基类返回的值来构建您自己的类。
@Override
public Parcelable onSaveInstanceState() {
final MySavedState ss = new MySavedState(super.onSaveInstanceState());
ss.myInt = 100;
return ss;
}
@Override
public void onRestoreInstanceState(Parcelable state) {
MySavedState ss = (MySavedState) state;
super.onRestoreInstanceState(ss.getSuperState());
if(ss.myInt == 100) {
Log.d("TAG", "Success!");
}
}
static class MySavedState extends Spinner.BaseSavedState {
int myInt;
public MySavedState(Parcelable superState) {
super(superState);
}
public MySavedState(Parcel source) {
super(source);
myInt = source.readInt();
}
}