Fragmentをネストする際の注意点

Fragmentが登場してからActivityに全てのコントローラーロジックが集約される悪夢から開放された訳ですが、公式リファレンスをちゃんと読まずに実装しているとハマりますよ、というお話。

そうそう、Fragment自体はHoneycomb (3.0)で登場しましたが、ネスト出来るようになったのはJelly Bean (4.2)からなんですね。

作業環境

Fragmentのネスト

Fragmentを使って開発をしていると当然それらをネストすることもあると思います。その際にFragmentTransactionやFragmentManagerを使うと思いますが、ActivityのRoot ViewにFragmentを入れる場合とFragmentにFragmentを入れる場合では微妙にやり方が異なります。

前者の場合はいつも通りにトランザクションを発行すれば良いんですが、後者の場合はそれだと思った通りに動きません。

公式リファレンスには以下のような記述があります。

To nest a fragment, simply call getChildFragmentManager() on the Fragment in which you want to add a fragment. This returns a FragmentManager that you can use like you normally do from the top-level activity to create fragment transactions.

Fragmentをネストしたい場合は、getChildFragmentManager()を使わないといけないようです。以下はFragmentをネストする際のサンプルコードです。

Fragment childFragment = new ChildFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.child_fragment, childFragment).commit();

ChildFragment内から親Fragmentの参照が欲しい場合には、getParentFragment()で取得することが出来ます。ちなみに、getChildFragmentManager()は、Support Library v4に含まれているため1.6から使うことが出来ます。

余談

上記の公式リファレンスの最後にこのような注釈があります。

Note: You cannot inflate a layout into a fragment when that layout includes a . Nested fragments are only supported when added to a fragment dynamically.

Fragmentをネストする際は必ず動的に追加しないといけないようです。

参考サイト