【问题标题】:Saving and restoring view state android [duplicate]保存和恢复视图状态android [重复]
【发布时间】: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 是 糟糕 设计如何让您生气的一个重要例子。

标签: android view bundle


【解决方案1】:

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

解决方案在这里:

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

【讨论】:

  • 你不要放弃结果——你的祖先可能已经保存了状态,然后你会以错误的顺序读出条目
【解决方案2】:

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

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

否则,您将失去超类保存的所有内容。

【讨论】:

  • onSaveInstanceState 的默认实现返回 null。还有,这里的bundle是Parcelable,没有putInt这样的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 2013-04-04
相关资源
最近更新 更多