【发布时间】:2011-08-28 01:42:29
【问题描述】:
我知道活动状态的保存和恢复。 但我想做的是保存和恢复视图的状态。 我有一个自定义视图和两个覆盖的方法:
@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: 错误的状态类,期待视图 状态但已接受课程 android.os.Bundle 代替。这 通常发生在两个视图 不同类型有相同的id 相同的层次结构。这个视图的 id 是 id/mapViewId。确保其他视图可以 不使用相同的ID。 在 android.view.View.onRestoreInstanceState(View.java:6161)
但这个视图是我活动中唯一的一个。所以,我问:
保存视图状态的正确方法是什么?
【问题讨论】:
-
我不得不笑,因为Android的设计多么荒谬。该方法不期望 View 状态 obviously,它 obviously 期望一个名为 Parcelable 的接口。是的,我们确实返回了一个有效的 Parcelable,它由 Bundle 实现。但它失败了一个荒谬的原因。我从未在.NET 中遇到过这种设计,当它需要一个接口时,如果我们返回那个确切的接口,应该不会有任何异常。例外应该说其他更有意义的东西 =))) Android 是 糟糕 设计如何让您生气的一个重要例子。