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

FragmentTransaction.add

フラグメントを切り替える方法は、FragmentTransaction.replaceで置換する方法の他にもう一つ、FragmentTransaction.addで追加するというものがある・・・。

FragmentTransaction | Android Developers

この場合のフラグメントの状態はどうなるのかを検証する・・・。

Menu1で、fragmentTransaction.replaceに代わって、fragmentTransaction.addでfragmentを追加する・・・。

Menu2も同様に・・・。

Menu3も同様に・・・。

さて、これでどうなるか・・・。

f:id:BG1:20160915120032p:plain

Menu1を選択、

f:id:BG1:20160915120106p:plain

onCreate・・・。

f:id:BG1:20160915120130p:plain

onCreateView・・・。

f:id:BG1:20160915120142p:plain

onStart・・・。

f:id:BG1:20160915120247p:plain

countは1・・・。

f:id:BG1:20160915120312p:plain

Menu2を選択してみる・・・。

f:id:BG1:20160915120335p:plain

onCreate・・・。

f:id:BG1:20160915120347p:plain

onCreateView・・・。

f:id:BG1:20160915120411p:plain

onStart・・・。

f:id:BG1:20160915120429p:plain

countは1・・・。

fragment1のonDestroyはおろか、onDestroyViewも呼ばれない・・・。
つまりViewごと残っているということである・・・。
この辺がreplaceとの違いで、まさに追加はするけど、前のFragment(Viewも含めて)を消すことはしないという特徴・・・。

f:id:BG1:20160915120649p:plain

Menu3を選択・・・。

f:id:BG1:20160915120711p:plain

onCreate・・・。

f:id:BG1:20160915120730p:plain

onCreateView・・・。

f:id:BG1:20160915120747p:plain

onStart・・・。

f:id:BG1:20160915120802p:plain

countが1・・・。

という感じでfragment3に切り替わったときもfragment2は残ったまま・・・。
addは、上に重なるというイメージである・・・。
(背景が透明だと文字が重なったりするのはそういうこと・・・。)

f:id:BG1:20160915121029p:plain

再度Menu1を選択してみると、

f:id:BG1:20160915121058p:plain

またonCreate・・・。

f:id:BG1:20160915121114p:plain

onCreateView・・・。

f:id:BG1:20160915121141p:plain

onStart・・・。

f:id:BG1:20160915121206p:plain

countは1・・・。

【Android】Activity, Fragment のライフサイクル関連 - TokunagaKazuya.tk

add() したときに既にバックスタックに同じタグの Fragment が存在する場合、Fragment は新規作成されず、既にインスタンス化してある Fragment が再表示される。

とあるが、tag1なのにonCreateされた・・・。

newで作ってるから、この記事のとは違うのかな・・・。
あとで調査・・・。

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

f:id:BG1:20160915122255p:plain

onDestroyView・・・。

f:id:BG1:20160915122313p:plain

onDestroy・・・。

fragment1は破棄されて、fragment3が表示されるが、特にどのハンドラも呼ばれていない・・・。
(onStartさえ呼ばれていないので、countが表示されない・・・。)

さらにバックキー・・・。

f:id:BG1:20160915122408p:plain

onDestroyView・・・。

f:id:BG1:20160915122425p:plain

onDestroy・・・。

fragment3の破棄、そしてfragment2の表示・・・。やはり、fragment2側はそのまま・・・。
さらにバックキー・・・。

f:id:BG1:20160915122528p:plain

onDestroyView・・・。

f:id:BG1:20160915122541p:plain

onDestroy・・・。

という感じで、fragment2が破棄、fragment1が表示されるが、これもそのまま・・・。

こんな感じで、addの場合、FragmentオブジェクトがViewも含めてそのまま残っているのが特徴・・・。
(実際にはonAttachとかonResumeとかいろいろ呼ばれてるらしいけど、その辺の細かい動作はあとで・・・。)

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