support libraryで一日はまり込んでいたことのメモ。
アクティビティの全体に配置されるフラグメントを置こうとして以下のようなコードを書くが、フラグメントが表示されない。ちなみに ActionbarActivityでなく FragmentActivityから派生したアクティビティでは問題なく表示される。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MainFragment fragment = (MainFragment) getSupportFragmentManager().findFragmentByTag("f1"); if (fragment == null) { fragment = new MainFragment(); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.add(android.R.id.content, fragment, "f1"); ft.commit(); } }
どうやらサポートライブラリのバグらしい。
- 雑草: [メモ]ICS未満のActionBarActivityにandroid.R.id.contentにFragmentをうまく表示できない
- getSupportFragmentManager().beginTransaction().add(android.R.id.content, f) not working - Stack Overflow
期待通りの動作をさせる一番簡単な方法は、フラグメント追加の前にsetContentViewで適当なビューを配置すること。空のレイアウトxmlを用意する方法でも構わないが、コードが一行で済む以下の方法がすっきりしていいかも。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new FrameLayout(this)); MainFragment fragment = (MainFragment) getSupportFragmentManager().findFragmentByTag("f1"); if (fragment == null) { fragment = new MainFragment(); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.add(android.R.id.content, fragment, "f1"); ft.commit(); } }
これでやんざむ本のコードをひと通り support libraryで書くことができそう。