保存和恢复视图状态android

时间:2011-05-18 13:19:55

标签: android view bundle

我知道活动状态保存和恢复。 但我想要做的是保存和恢复视图的状态。 我有一个自定义视图和两个重写方法:

@Override
protected void onRestoreInstanceState(Parcelable state) {
    if (state instanceof Bundle) {
        Bundle bundle = (Bundle) state;
        currentLeftX = bundle.getInt(CURRENT_LEFT_X_PARAM, 0);
        currentTopY = bundle.getInt(CURRENT_TOP_Y_PARAM, 0);
    }
    super.onRestoreInstanceState(state);
}

@Override
protected Parcelable onSaveInstanceState() {
    super.onSaveInstanceState();
    Bundle bundle = new Bundle();
    bundle.putInt(CURRENT_LEFT_X_PARAM, currentLeftX);
    bundle.putInt(CURRENT_TOP_Y_PARAM, currentTopY);
    return bundle;
}

我希望这可以无缝工作,但遇到并且错误:

  

引起:   java.lang.IllegalArgumentException异常:   错误的州级,期待View   国家但收到了课程   android.os.Bundle而不是。这个   通常在两个视图时发生   不同的类型具有相同的ID   相同的等级。这个视图的id是   ID / mapViewId。确保其他观点   不要使用相同的ID。           在android.view.View.onRestoreInstanceState(View.java:6161)

但是这个观点是我活动中唯一的观点。所以,我问:

保存视图状态的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

您删除super.OnSaveInstanceState()的结果并返回自己的结果。 然后在OnRestoreInstanceState(Parcelable)返回您创建的那个。

解决方案就是:

How to prevent custom views from losing state across screen orientation changes #2

答案 1 :(得分:-3)

我可能错了,但我认为您需要保存父回复的捆绑包:

@Override
protected Parcelable onSaveInstanceState() {
    Parcelable bundle = super.onSaveInstanceState();
    bundle.putInt(CURRENT_LEFT_X_PARAM, currentLeftX);
    bundle.putInt(CURRENT_TOP_Y_PARAM, currentTopY);
    return bundle;
}

否则你将丢失超类保存的所有内容。