ActionbarActivityに全画面のフラグメントを配置

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();
        }
    }

どうやらサポートライブラリのバグらしい。

期待通りの動作をさせる一番簡単な方法は、フラグメント追加の前に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で書くことができそう。