まーた、はまりました 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 件のコメント:
コメントを投稿