2013年5月1日水曜日

Support package の Fragment を使うときの注意点

つまり、2.x で Fragment を使うときの注意点ですね。

まーた、はまりました orz

Fragment が Activity の全画面を占めていて、FragmentTransaction を使って Activity 内で画面切り替えをする場合です。

setContentView() でセットする View のコンテナである FrameLayout の ID が android.R.id.content なので、これを利用して @Override protected void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); Page1Fragment f = new Page1Fragment(); FragmentManager manager = getSupportFragmentManager(); manager.beginTransaction() .replace(android.R.id.content, f) .commit(); } public void moveToPage2() { Page2Fragment f = new Page2Fragment(); FragmentManager manager = getSupportFragmentManager(); manager.beginTransaction() .addToBackStack("tutorial2") .replace(android.R.id.content, f) .commit(); } とすれば良さそうですが、実はこれだと Page1Fragment の View が画面に残ってしまって、Page2Fragment に遷移すると Page1Fragment の View と Page2Fragment の View が重なって表示されてしまいます。

この謎現象を解消するには、Activity に setContentView() で適当な View (FrameLayout とか)をセットします。 @Override protected void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); setContentView(new FrameLayout(this)); Page1Fragment f = new Page1Fragment(); FragmentManager manager = getSupportFragmentManager(); manager.beginTransaction() .replace(android.R.id.content, f) .commit(); } この FrameLayout は最初の FragmentTransaction で replace され全く使われないのですが、android.R.id.content を replace の対象とする場合、なにかしら setContentView() でセットしないといけないようです。

ちなみに、3.0 以降では、setContentView() を呼ばなくても謎現象は起こりません。


0 件のコメント:

コメントを投稿