web-dev-qa-db-ja.com

ビューステートの保存と復元android

アクティビティ状態の保存と復元を知っています。しかし、私がしたいのは、ビューの状態を保存および復元することです。カスタムビューと2つのオーバーライドされたメソッドがあります。

@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 Stateを予期していましたが、代わりにクラスAndroid.os.Bundleを受け取りました。これは通常、異なるタイプの2つのビューが同じ階層内で同じIDを持つ場合に発生します。このビューのIDはid/mapViewIdです。他のビューが同じIDを使用しないようにしてください。 Android.view.View.onRestoreInstanceState(View.Java:6161)で

しかし、このビューは私の活動の中で唯一のものです。だから、私は尋ねています:

ビューの状態を保存する正しい方法は何ですか?

30
Vladimir Ivanov

super.OnSaveInstanceState()の結果を削除し、独自の結果を返します。その後、OnRestoreInstanceState(Parcelable)で作成したものを返します。

その解決策は次のとおりです。

カスタムビューが画面の向きを変更しても状態が失われないようにする方法#2

3
Kobor42