我知道活动状态保存和恢复。 但我想要做的是保存和恢复视图的状态。 我有一个自定义视图和两个重写方法:
@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)
但是这个观点是我活动中唯一的观点。所以,我问:
保存视图状态的正确方法是什么?
答案 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;
}
否则你将丢失超类保存的所有内容。