[メモ]ICS未満のActionBarActivityにandroid.R.id.contentにFragmentをうまく表示できない
support-v7に含まれているActionBarActivityを使うと、Android2.3等の古いOSでもActionBarのあるActivityを使うことが出来ます。
ですが、ちょっとしたハマりどころがあったのでメモ。
とりあえず実際に中身のあるFragmentを1つ記述して、それをActionBarActivityで表示するとします。
中身をInnerFragmentとして、例えばこんな感じになるのではないでしょうか。
理由については理解しきっていないためここでは省略してしまいますが、これを解決するためには自前のレイアウトを介せば何も問題ありません。
FrameLayoutだけ置いたレイアウトXMLを作成しsetContentView()でセットした後、FragmentTransactionではFrameLayoutのIDを使うようにしましょう。
詳しいことはStackOverflow読みましょう。
(XMLのID = R.layout.frame, FrameLayoutのID = R.id.frame とした例)
ですが、ちょっとしたハマりどころがあったのでメモ。
とりあえず実際に中身のある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(); }
コメント
コメントを投稿