フラグメントを切り替える方法は、FragmentTransaction.replaceで置換する方法の他にもう一つ、FragmentTransaction.addで追加するというものがある・・・。
FragmentTransaction | Android Developers
この場合のフラグメントの状態はどうなるのかを検証する・・・。
Menu1で、fragmentTransaction.replaceに代わって、fragmentTransaction.addでfragmentを追加する・・・。
Menu2も同様に・・・。
Menu3も同様に・・・。
さて、これでどうなるか・・・。
Menu1を選択、
onCreate・・・。
onCreateView・・・。
onStart・・・。
countは1・・・。
Menu2を選択してみる・・・。
onCreate・・・。
onCreateView・・・。
onStart・・・。
countは1・・・。
fragment1のonDestroyはおろか、onDestroyViewも呼ばれない・・・。
つまりViewごと残っているということである・・・。
この辺がreplaceとの違いで、まさに追加はするけど、前のFragment(Viewも含めて)を消すことはしないという特徴・・・。
Menu3を選択・・・。
onCreate・・・。
onCreateView・・・。
onStart・・・。
countが1・・・。
という感じでfragment3に切り替わったときもfragment2は残ったまま・・・。
addは、上に重なるというイメージである・・・。
(背景が透明だと文字が重なったりするのはそういうこと・・・。)
再度Menu1を選択してみると、
またonCreate・・・。
onCreateView・・・。
onStart・・・。
countは1・・・。
【Android】Activity, Fragment のライフサイクル関連 - TokunagaKazuya.tk
add() したときに既にバックスタックに同じタグの Fragment が存在する場合、Fragment は新規作成されず、既にインスタンス化してある Fragment が再表示される。
とあるが、tag1なのにonCreateされた・・・。
newで作ってるから、この記事のとは違うのかな・・・。
あとで調査・・・。
さて、バックキーで戻してみよう・・・。
onDestroyView・・・。
onDestroy・・・。
fragment1は破棄されて、fragment3が表示されるが、特にどのハンドラも呼ばれていない・・・。
(onStartさえ呼ばれていないので、countが表示されない・・・。)
さらにバックキー・・・。
onDestroyView・・・。
onDestroy・・・。
fragment3の破棄、そしてfragment2の表示・・・。やはり、fragment2側はそのまま・・・。
さらにバックキー・・・。
onDestroyView・・・。
onDestroy・・・。
という感じで、fragment2が破棄、fragment1が表示されるが、これもそのまま・・・。
こんな感じで、addの場合、FragmentオブジェクトがViewも含めてそのまま残っているのが特徴・・・。
(実際にはonAttachとかonResumeとかいろいろ呼ばれてるらしいけど、その辺の細かい動作はあとで・・・。)