フラグメントトランザクションのさまざまなケースですべてのフラグメントライフサイクルのメソッドが呼び出されることを理解するためのデモを作成しましたが、ほとんどの呼び出しは予想どおり、大胆に書いたまだ混乱しているものはほとんどありません。
2つのフラグメントAとBがあり、それらの間でトランザクションを実行しているとします
事例1
フラグメントBがフラグメントAに追加された場合
_getActivity().getSupportFragmentManager().beginTransaction().add(R.id.container, fragementB).addToBackStack(null).commit();
_
フラグメントB
onAttach
onCreate
onCreateView
onActivityCreated
onStart
onResume
フラグメントAのライフサイクルメソッドは呼び出されていません。
私が期待したものは?
フラグメントAが表示されないため、フラグメントAのonStopメソッドが呼び出されます
ドキュメントによると
停止-フラグメントは表示されません。ホストアクティビティが停止されたか、フラグメントがアクティビティから削除されたが、バックスタックに追加されました。停止したフラグメントはまだ生きています(すべての状態およびメンバー情報はシステムによって保持されます)。ただし、ユーザーには表示されなくなり、アクティビティが強制終了されると強制終了されます。
これは、同じアクティビティで新しいフラグメントが追加されたときに、現在のフラグメントのメソッドが呼び出されないことを意味しますか?
次に、フラグメントBでpopBackStack()
を使用します
フラグメントB
onPause
onStop
onDestroyView
onDestroy
onDetach
フラグメントAのライフサイクルメソッドは呼び出されません
私が期待したものは?
フラグメントAが表示されるようになったため、フラグメントAのonStartメソッドが呼び出されます
事例2
フラグメントBがフラグメントAに置き換わる場合
_getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, fragementB).commit();
_
フラグメントB
onAttach
onCreate
onCreateView
onActivityCreated
onStart
onResume
フラグメントA
onPause
onStop
onDestroyView
onDestroy
onDetach
すべてが期待通りでした
事例3
フラグメントBがフラグメントAをバックスタックに保持する場合
_ getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, fragementB).addToBackStack("tag").commit();
_
フラグメントB
onAttach
onCreate
onCreateView
onActivityCreated
onStart
onResume
フラグメントA
onPause
onStop
onDestroyView
フラグメントAのonDestroyおよびonDetachメソッドは呼び出されません。そのメソッドが呼び出されないのはなぜですか?ドキュメントメソッドreplace
に従ってBcozは、既にコンテナ内にあるすべてのフラグメントを削除し、新しいコンテナを同じコンテナに追加します
次に、フラグメントBでpopBackStack()
を使用します
フラグメントA
onCreateView
onActivityCreated
onStart
onResume
フラグメントB
onPause
onStop
onDestroyView
onDestroy
onDetach
これは、同じアクティビティで新しいフラグメントが追加されたときに、現在のフラグメントのメソッドが呼び出されないことを意味しますか?
正しい、最初のフラグメントAは、削除または置換された場合にのみ影響を受けます(ケース2)。別のフラグメントを追加すると、フラグメントAの上にフラグメントBが表示されるだけで、ライフサイクルコールバックは呼び出されません。
期待していたことは何ですか?
フラグメントAが表示されるため、フラグメントAのonStartメソッドが呼び出されます
繰り返しますが、フラグメントBはAの上に追加されたため、フラグメントAはBの削除の影響を受けません。
フラグメントAのonDestroyおよびonDetachメソッドは呼び出されません。なぜ呼び出されないのですか?ドキュメントメソッドごとにBcozを置き換えると、既にコンテナ内にあるすべてのフラグメントが削除され、新しいコンテナが同じコンテナに追加されます
単純な置換とは異なり、置換トランザクションをバックスタックに追加すると、実際にそのアクティビティにアタッチされた最初のフラグメントが保持され、ビューのみが破棄されます。
バックスタックをポップすると、フラグメントBが削除され、フラグメントAはonCreateView()から開始してビューを再作成します。
setUserVisibleHint は、フラグメントが表示されているか表示されていないときに呼び出されます