如何保存自定义微调器状态

时间:2016-11-17 03:43:12

标签: java android

我扩展了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建议它“无法解析符号'已保存状态'”。 enter image description here

那么我该如何保存自定义Spinner的状态呢?

1 个答案:

答案 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();
    }
}