うさがにっき

読書感想文とプログラムのこと書いてきます

fragment上のcustomViewの状態再生成方法

概要

fragment上にあるwidgetは再生成時に状態も再生成されるが、customされた独自Viewなどは再生成されない
なので、独自Viewの状態再生成についてまとめる

詳細

色を選択するカスタムViewなら選択された色を保存すべき
onSaveInstanceStateでParcelableに格納し、onRestoreInstanceStateでリストアしている

public class ColorPickerView extends View {
    public ColorPickerView(Context context) {
        super(context);
    }

    @Override
        protected Parcelable onSaveInstanceState() {
        Parcelable superState = super.onSaveInstanceState();
        SavedState ss = new SavedState(superState);
        ss.color = getColor();
        return ss;
    }

    @Override
    protected void onRestoreInstanceState(Parcelable state) {
        SavedState ss = (SavedState) state;
        super.onRestoreInstanceState(ss.getSuperState());
        setColor(ss.color);
        requestLayout();

    }

    static class SavedState extends BaseSavedState {
        int color;

        SavedState(Parcelable superState) {
            super(superState);
        }

        private SavedState(Parcel in) {
            super(in);
            // writeToParcelで保存した順番に読み取る
            color = in.readInt();
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            super.writeToParcel(dest, flags);
            dest.writeInt(color);
        }

        public static final Parcelable.Creator<SavedState> CREATOR
                = new Parcelable.Creator<SavedState>() {

            @Override
            public SavedState createFromParcel(Parcel in) {
                return new SavedState(in);
            }

            @Override
            public SavedState[] newArray(int size) {
                return new SavedState[size];
            }
        };
    }
}

参考

tatsu-zine.com
View.BaseSavedState | Android Developers