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

うさがにっき

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

fragmentの作成、再生成について

Android

概要

fragmentを作成する際に、画面回転イベントなどでactivityと共にfragmentも再生成されることがよくある
その際、再生成前の状態を保持する方法

詳細

onCreateでfragmentを以下のように作成すると、Activityが再生成されるタイミングでfragmentが新しく作り直されてしまって、状態が保持されない

	// bad knowhow
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		FragmentManager manager = getFragmentManager();

		// 常に新しいインスタンスを作成していると状態を引き継げない
		MainFragment mainFragment = new MainFragment();
		manager.beginTransaction().replace(android.R.id.content, mainFragment, "main").commit();
	}

状態を保持するためにはfindFragmentByTag()メソッドを使ってActivityにアタッチしたFragmentを取得する

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		MainFragment mainFragment;

		FragmentManager manager = getFragmentManager();
		Fragment f = manager.findFragmentByTag("main");

		if(f != null) {
			// 再生成時にはfindFragmentByTag()で取得できるためこちらに入る
			mainFragment = (MainFragment) f;
		}else {
			// 初回時には取得できないため初期化する
			mainFragment = new MainFragment();
			manager.beginTransaction().replace(android.R.id.content, mainFragment, "main").commit();
		}
	}

これによりActivityが再生成行われてもfragmentの状態を引き継げる

参考


Master of Fragment (Android Professional Developerシリーズ) - 達人出版会