保存和恢复视图状态Android

32

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

@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。 at android.view.View.onRestoreInstanceState(View.java:6161)

但是这个视图是我活动中唯一的视图。所以我想问:

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


请看这个答案:https://dev59.com/GnA65IYBdhLWcg3w9DqF#3542895 - BFil
我不得不笑,因为Android的设计是多么荒谬可笑。这个方法显然不需要View状态,而是期望一个名为Parcelable的接口。是的,我们确实返回了一个有效的Parcelable,它由Bundle实现。但由于一个荒谬的原因,它失败了。在.NET中,我从未遇到过这种设计,当它期望一个接口时,如果我们确实返回了该接口,就不应该有任何异常。异常应该说出更有意义的东西=))) Android是一个很好的例子,说明糟糕的设计会让你感到恼怒。 - King King
2个回答

4

1
你不要丢失结果 - 你的祖先可能已经保存了状态,然后你会以错误的顺序读取条目。 - ataulm

-4

我可能错了,但我认为您需要保存父级返回的bundle:

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

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

4
onSaveInstanceState的默认实现返回null。另外,在这里,bundle是Parcelable类型,它没有像putInt这样的方法。 - Vladimir Ivanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接