読者です 読者をやめる 読者になる 読者になる

うさがにっき

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

fragmentの状態保持について

Android

概要

Fragment再生成時に値を保持する方法

詳細

Fragment再生成時に値を保持するにはActivityと同じように、onSaveInstanceState()を使い、再生成時onCreate()、onActivityCreate()などでBundleから保存した値を取得する

	@Override
	public void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		outState.putBoolean("isLogin", isLogin );
	}
	
	@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
 		
 		// 再生成時にはsavedInstanceStateがnullじゃない
        if (savedInstanceState != null) {
        	isLogin = savedInstanceState.getBoolean("isLogin");
        }
     }

fragmentに配置してある各ViewについてはカスタムViewでなければ、fragment自身がViewの再生成を呼び出してくれるので問題無し
Androidの通常のViewであれば自動で再生成を行ってくれるが、カスタムViewを使っている場合はカスタムView自身に再生成処理を入れる必要がある

	@Override
	public Parcelable onSaveInstanceState() {
		Parcelable superState = super.onSaveInstanceState();
		SavedState ss = new SavedState(superState);
		// 再生成時読み込みたい値
		ss.color = getColor();
		return ss;
	}

	@Override
	public void onRestoreInstanceState(Parcelable state) {
		SavedState ss = (SavedState) state;
		super.onRestoreInstanceState(ss.getSuperState());
		setColor(ss.color);
		// レイアウトの初期化
		requestLayout();
	}		

	public static class SavedState extends BaseSavedState {
	    int color;

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

	    private SavedState(Parcelable in) {
	        super(in);
	        color = in.readInt();
	    }

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

	    public static final Parcelable.Creator<SavedState> CREATOR
	            = new Parcelable.Creator<SavedState>() {
	        public SavedState createFromParcel(Parcel in) {
	            return new SavedState(in);
	        }

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