FragmentTransaction.replaceの後に、FragmentTransaction.addToBackStackを呼ぶと、置換前のフラグメントをバックスタックと呼ばれる領域(スタック?)に保存してくれる・・・。
これをすることで、バックキーを押したときに前のフラグメントに戻ることができる・・・。
FragmentTransaction | Android Developers
バックキーで普通に1つ前に戻るときはnullを指定する・・・。
(なんか変な呼び出し方だなあ・・・。)
ある特定のフラグメントが表示された状態の時に戻りたいというような場合は、特定のフラグメントを次の別フラグメントにreplaceした後に、引数にトランザクション名という適当な文字列を指定してaddToBackStackする・・・。
この場合は、FragmentManager.popBackStackで戻れる・・・。
まあ、今回はnullで戻るようにする・・・。
Menu1の時、こんな感じで、nullを指定してaddToBackStack・・・。
これだけでバックキーで戻れる・・・。
Menu2の時も同様に・・・。
Menu3も・・・。
さて、MainFragmentだが、
onCreateViewでもToast出すようにした・・・。
さらにonDestroyViewでも出すように・・・。
これでフラグメントの状態がどうなるかを見てみる・・・。
Menu1を押す・・・。
onCreate・・・。
onCreateView・・・。
onStart・・・。
countは1・・・。
さて、
Menu2を押すと、
赤いfragment1のonDestroyViewが呼ばれる・・・。
その次はfragment2のonCreate・・・。
onCreateView・・・。
onStart・・・。
countは1・・・。
というわけで赤いfragment1のonDestroyが呼ばれていない・・・。
onDestroyViewは呼ばれているのでViewの破棄は行われているが、onDestroyが呼ばれていないのでFragmentオブジェクト自体は残っているのである・・・。
実はaddToBackStackを呼ぶと、このようにreplaceでもFragmentオブジェクトは破棄されないのである・・・。
Menu3を押す場合も、
onDestroyViewは呼ばれるが、onDestroyは呼ばれずに、
fragment3のonCreateが始まる・・・。
さて、バックキーで戻ってみよう・・・。
青のfragment3から緑のfragment2戻ると、fragment3のonDestroyViewが呼ばれた後、
fragment3のonDestroyが呼ばれる・・・。
ここで破棄なのである・・・。もうfragment3は不要だからね・・・。
fragment2のonCreateViewが呼ばれて、
onStart・・・。
fragment2は破棄されずに残っていたので、onCreateが呼ばれず、2回目のonStartが開始され、countが2になっているわけ・・・。
fragment2からfragment1へ戻る場合も、
fragment2のonDestroyView・・・。
onDestroy・・・。
fragment1のonCreateView・・・。
fragment1オブジェクトが残っていたので、countは2・・・。
(これだけちょっと撮り直した・・・。)
addToBackStackだと、こんな感じで戻れるし、Fragmentオブジェクトも残っているのが特徴・・・。