2013年5月1日水曜日

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

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

まーた、はまりました orz

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

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

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

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


0 件のコメント:

コメントを投稿