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

FragmentTransaction.addToBackStack

FragmentTransaction.replaceの後に、FragmentTransaction.addToBackStackを呼ぶと、置換前のフラグメントをバックスタックと呼ばれる領域(スタック?)に保存してくれる・・・。
これをすることで、バックキーを押したときに前のフラグメントに戻ることができる・・・。

FragmentTransaction | Android Developers

バックキーで普通に1つ前に戻るときはnullを指定する・・・。
(なんか変な呼び出し方だなあ・・・。)

ある特定のフラグメントが表示された状態の時に戻りたいというような場合は、特定のフラグメントを次の別フラグメントにreplaceした後に、引数にトランザクション名という適当な文字列を指定してaddToBackStackする・・・。
この場合は、FragmentManager.popBackStackで戻れる・・・。

まあ、今回はnullで戻るようにする・・・。

Menu1の時、こんな感じで、nullを指定してaddToBackStack・・・。
これだけでバックキーで戻れる・・・。

Menu2の時も同様に・・・。

Menu3も・・・。

さて、MainFragmentだが、

onCreateViewでもToast出すようにした・・・。

さらにonDestroyViewでも出すように・・・。

これでフラグメントの状態がどうなるかを見てみる・・・。

f:id:BG1:20160914160839p:plain

Menu1を押す・・・。

f:id:BG1:20160914160853p:plain

onCreate・・・。

f:id:BG1:20160914160923p:plain

onCreateView・・・。

f:id:BG1:20160914160946p:plain

onStart・・・。

f:id:BG1:20160914161021p:plain

countは1・・・。
さて、

f:id:BG1:20160914161101p:plain

Menu2を押すと、

f:id:BG1:20160914161135p:plain

赤いfragment1のonDestroyViewが呼ばれる・・・。

f:id:BG1:20160914161218p:plain

その次はfragment2のonCreate・・・。

f:id:BG1:20160914161253p:plain

onCreateView・・・。

f:id:BG1:20160914161317p:plain

onStart・・・。

f:id:BG1:20160914161817p:plain

countは1・・・。
というわけで赤いfragment1のonDestroyが呼ばれていない・・・。
onDestroyViewは呼ばれているのでViewの破棄は行われているが、onDestroyが呼ばれていないのでFragmentオブジェクト自体は残っているのである・・・。
実はaddToBackStackを呼ぶと、このようにreplaceでもFragmentオブジェクトは破棄されないのである・・・。

f:id:BG1:20160914161739p:plain

Menu3を押す場合も、

f:id:BG1:20160914161933p:plain

onDestroyViewは呼ばれるが、onDestroyは呼ばれずに、

f:id:BG1:20160914162008p:plain

fragment3のonCreateが始まる・・・。

さて、バックキーで戻ってみよう・・・。

f:id:BG1:20160914162214p:plain

青のfragment3から緑のfragment2戻ると、fragment3のonDestroyViewが呼ばれた後、

f:id:BG1:20160914162322p:plain

fragment3のonDestroyが呼ばれる・・・。
ここで破棄なのである・・・。もうfragment3は不要だからね・・・。

f:id:BG1:20160914162706p:plain

fragment2のonCreateViewが呼ばれて、

f:id:BG1:20160914162752p:plain

onStart・・・。

f:id:BG1:20160914162809p:plain

fragment2は破棄されずに残っていたので、onCreateが呼ばれず、2回目のonStartが開始され、countが2になっているわけ・・・。

fragment2からfragment1へ戻る場合も、

f:id:BG1:20160914163610p:plain

fragment2のonDestroyView・・・。

f:id:BG1:20160914163630p:plain

onDestroy・・・。

f:id:BG1:20160914163654p:plain

fragment1のonCreateView・・・。

f:id:BG1:20160914163720p:plain

fragment1オブジェクトが残っていたので、countは2・・・。
(これだけちょっと撮り直した・・・。)

addToBackStackだと、こんな感じで戻れるし、Fragmentオブジェクトも残っているのが特徴・・・。

Sample/android/FragmentTransaction/addToBackStack/src/FragmentTransaction at master · bg1bgst333/Sample · GitHub