FragmentManager.getFragments()で一部nullが返ってくる問題

8個のFragmentと4つの項目が入ったListViewからなるビューを作成する機会があった。
ListViewの項目をクリックしたらFragmentが置き換わる、というものだ。
クリックした際追加するFragmentは上限が8個で必ずしも8個ではない、という状況であった。


クリックされたらgetFragments()で今あるFragmentを取得し削除し、新たに選択された項目のFragmentを追加する、という簡単なものだと思い、以下のコードを書いた。

for( Fragment fragment : fragmentManager.getFragments() ) {
    fragmentTransaction.remove(fragment);
}

しかしエラーがこんなエラーが…
java.lang.NullPointerException: Attempt to invoke virtual method
'boolean java.lang.String.equals(java.lang.Object)' on a null object reference

ん…?
なぜぬるぽが…getFragments()って現在保持しているFragmentを返すんじゃなかったのか…


ということですこし調べて見た結果、直前のコミットでremoveしたFragmentのところに新たにFragmentを追加していなかった場合、getFragments()を使用すると追加してないFragmentのみnullとなって返ってくるということが判明した。


結局上記のコードを

for( Fragment fragment : fragmentManager.getFragments() ) {
    if (fragment == null)
        continue;

    fragmentTransaction.remove(fragment);
}

というふうに書き加え解決したが根本的な解決にはなっていない気がする…


どうしてこんな仕様なのか…自分のコードが間違っているのか…
とりあえず解決は出来ました。めでたしめでたし