読者です 読者をやめる 読者になる 読者になる

FragmentManager.popBackStack

replace、または、addした時に、addToBackStackを呼んでおけば、バックキーで1つ前のフラグメントに戻ることができた・・・。
これは、バックキーを押した場合、デフォルトでpopBackStackが呼ばれるからである・・・。

FragmentManager | Android Developers

いくつかオーバーライドメソッドがあるが、何も指定しない場合は1つ前に戻るタイプ・・・。
最初に文字列(String)を指定するタイプは、addToBackStackで付けたトランザクション名のトランザクション後に戻す・・・。(第2引数が0の場合・・・。)

menuのmain.xml

Menu1からMenu7までに増やした・・・。

strings.xmlもそれに合わせて・・・。

Menu1のaddToBackStackでnullではなく、トランザクション名"tag1"を付けた・・・。
(addの時の"tag1"と混同しちゃうなあ・・・。失敗した・・・。別物です・・・。)

Menu2のaddToBackStackは"tag2"・・・。

Menu3のaddToBackStackは"tag3"・・・。

こうしておくと、このトランザクション名をpopBackStackに指定することでそこに戻すことができる・・・。

Menu4の時は、popBackStackでトランザクション"tag1"後の状態まで戻す・・・。

例えば、1番最初のデフォルト画面から、赤いfragment1に切り替わったとき、addToBackStackで"tag1"と指定していたとする・・・。
そのあとも他の画面に何度か切り替えてから、popBackStackで"tag1"を指定すると、第2引数が0なら赤いfragment1、POP_BACK_STACK_INCLUSIVEの場合は最初のデフォルト画面になる・・・。
今回は0のトランザクション後にしておく・・・。

Menu5は"tag2"・・・。

Menu6は"tag3"・・・。

Menu7は引数なしバージョンを呼ぶ・・・。
これは1つ前に戻る・・・。

MainFragment.javaには、

onResume、onPause、onStopを追加し、countを増やす処理もonResumeに移した・・・。

f:id:BG1:20160916183120p:plain

白いデフォルト画面で、Menu1を選択・・・。

f:id:BG1:20160916183149p:plain

onCreate・・・。

f:id:BG1:20160916183221p:plain

onCreateView・・・。

f:id:BG1:20160916183241p:plain

onStart・・・。

f:id:BG1:20160916183253p:plain

onResume・・・。

f:id:BG1:20160916183310p:plain

countは1・・・。
ここまでは想定通り・・・。

f:id:BG1:20160916183408p:plain

Menu2を選択・・・。

f:id:BG1:20160916183428p:plain

onCreate・・・。

f:id:BG1:20160916183443p:plain

onCreateView・・・。

f:id:BG1:20160916183503p:plain

onStart・・・。

f:id:BG1:20160916183520p:plain

onResume・・・。

f:id:BG1:20160916183537p:plain

countが1・・・。

fragment2がonCreateからonResumeまで呼ばれていくのはいいとして、
fragment1のonPauseが呼ばれない・・・、というより何も呼ばれていない・・・。
ここが不思議なところだが、

【Android】Fragmentを使うときのコツとか色々 - Qiita

Show/Hide
  セットされている(Add済みの)Fragmentの表示/非表示を切り替える。
  このとき、ライフサイクルは変化しない。

フラグメントを追加して、前のフラグメントが非表示になった場合なども、ライフサイクルは変化しないのだろうか・・・。
Activityの非表示とは違うみたい・・・。注意・・・。

f:id:BG1:20160916184942p:plain

Menu3でfragment3を追加・・・。
(onCreate~onResumeまでのトーストは省略・・・。)
やはり、fragment2のハンドラはどれも呼ばれない・・・。

f:id:BG1:20160916185119p:plain

ここでMenu4を選択・・・。
"tag1"は、白い画面→fragment1のトランザクションを示しているので、

f:id:BG1:20160916185304p:plain

赤に戻ってくる・・・。
この時、onPause・・・。

f:id:BG1:20160916185421p:plain

onStop・・・。

f:id:BG1:20160916185442p:plain

onDestroyView・・・。

f:id:BG1:20160916185520p:plain

onDestroy・・・。

f:id:BG1:20160916185646p:plain

もう一度onPause・・・。

f:id:BG1:20160916185714p:plain

onStop・・・。

f:id:BG1:20160916185731p:plain

onDestroyView・・・。

f:id:BG1:20160916185754p:plain

onDestroy・・・。

最初から流れを書くと、

白い画面→fragment1→fragment2→fragment3
    ↑
    tag1

となっている状態でtag1の後に戻れと言ってるのだから、fragment3とfragment2は破棄されてfragment1に戻ってくる・・・。
この2つのFragmentの破棄によって、onPauseからonDestroyまで、2回ずつ呼ばれているのである・・・。

白い画面→fragment1→fragment2→fragment3→fragment1
          ↑
         tag2

この時のMenu5もfragment2が表示されるし、

白い画面→fragment1→fragment2→fragment3→fragment1→fragment2
               ↑
               tag3

この時のMenu6もfragment3が表示される・・・。
そして、その後ろにあった2つのFragmentは破棄される・・・。

tag3の位置、fragment3からMenu7で戻ると、

f:id:BG1:20160916191557p:plain

fragment2に戻り、さらにMenu7で、

f:id:BG1:20160916191813p:plain

fragment1に戻り、さらにMenu7で、

f:id:BG1:20160916191850p:plain

最初の白い画面に戻れた・・・。
ということで、バックスタックの状態も復元されているのがわかった・・・。

Sample/android/FragmentManager/popBackStack/src/FragmentManager at master · bg1bgst333/Sample · GitHub