web-dev-qa-db-ja.com

フラグメントトランザクション中にフラグメントのライフサイクルメソッド呼び出しを理解する

フラグメントトランザクションのさまざまなケースですべてのフラグメントライフサイクルのメソッドが呼び出されることを理解するためのデモを作成しましたが、ほとんどの呼び出しは予想どおり、大胆に書いたまだ混乱しているものはほとんどありません。

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

15

これは、同じアクティビティで新しいフラグメントが追加されたときに、現在のフラグメントのメソッドが呼び出されないことを意味しますか?

正しい、最初のフラグメントAは、削除または置換された場合にのみ影響を受けます(ケース2)。別のフラグメントを追加すると、フラグメントAの上にフラグメントBが表示されるだけで、ライフサイクルコールバックは呼び出されません。

期待していたことは何ですか?

フラグメントAが表示されるため、フラグメントAのonStartメソッドが呼び出されます

繰り返しますが、フラグメントBはAの上に追加されたため、フラグメントAはBの削除の影響を受けません。

フラグメントAのonDestroyおよびonDetachメソッドは呼び出されません。なぜ呼び出されないのですか?ドキュメントメソッドごとにBcozを置き換えると、既にコンテナ内にあるすべてのフラグメントが削除され、新しいコンテナが同じコンテナに追加されます

単純な置換とは異なり、置換トランザクションをバックスタックに追加すると、実際にそのアクティビティにアタッチされた最初のフラグメントが保持され、ビューのみが破棄されます。

バックスタックをポップすると、フラグメントBが削除され、フラグメントAはonCreateView()から開始してビューを再作成します。

14
Hanan Rofe Haim

setUserVisibleHint は、フラグメントが表示されているか表示されていないときに呼び出されます

0
Robin Zhou