[メモ]ICS未満のActionBarActivityにandroid.R.id.contentにFragmentをうまく表示できない

support-v7に含まれているActionBarActivityを使うと、Android2.3等の古いOSでもActionBarのあるActivityを使うことが出来ます。
ですが、ちょっとしたハマりどころがあったのでメモ。

とりあえず実際に中身のあるFragmentを1つ記述して、それをActionBarActivityで表示するとします。
中身をInnerFragmentとして、例えばこんな感じになるのではないでしょうか。
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    InnerFragment fragment = new InnerFragment();
    transaction.replace(android.R.id.content, fragment);
    transaction.commit();
}
これでも別にクラッシュは起きませんし、ICS以降では普通に表示されます。 ですが、Android2.3等で動かすと何も表示されません。

理由については理解しきっていないためここでは省略してしまいますが、これを解決するためには自前のレイアウトを介せば何も問題ありません。
FrameLayoutだけ置いたレイアウトXMLを作成しsetContentView()でセットした後、FragmentTransactionではFrameLayoutのIDを使うようにしましょう。
詳しいことはStackOverflow読みましょう。

(XMLのID = R.layout.frame, FrameLayoutのID = R.id.frame とした例)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.frame);
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    InnerFragment fragment = new InnerFragment();
    transaction.replace(R.id.frame, fragment);
    transaction.commit();
}

コメント

このブログの人気の投稿

診断メーカービューアの今後について

ポインティングデバイスに悩む

Mastodon v3.2.0 アップデートメモ (S3+CloudFront環境)