FragmentTransactionの Androidドキュメントで、2つの非常によく似たメソッドに気づきました:detach
とremove
。そこにある説明は、それぞれをいつ使用するかについての洞察を提供していないようであり、私が言うことができることから、それらは同じように見えます。
では、これら2つの方法の違いは何ですか?
FragmentTransactionの Androidドキュメントで、2つの非常によく似たメソッドに気づきました:detach
とremove
。そこにある説明は、それぞれをいつ使用するかについての洞察を提供していないようであり、私が言うことができることから、それらは同じように見えます。
では、これら2つの方法の違いは何ですか?
回答:
detachメソッドはUIからフラグメントを削除しますが、その状態はフラグメントマネージャーによって維持されます。つまり、変更されたViewHierarchyを使用してattachメソッドを呼び出すことで、このフラグメントを再利用できます。
削除は、フラグメントインスタンスを再接続できないことを意味します。フラグメントトランザクションに再度追加する必要があります。
ソースコメント
Fragmentがデタッチされると、そのonPause、onStop、およびonDestroyViewメソッドが(この順序で)のみ呼び出されることがわかります。一方、フラグメントが削除されると、そのonPause、onStop、onDestroyView、onDestroy、onDetachメソッドが(この順序で)呼び出されます。同様に、アタッチする場合、フラグメントのonCreateView、onStart、およびonResumeメソッドのみが呼び出されます。追加時に、フラグメントのonAttach、onCreate、onCreateView、onStart、onResumeメソッドが(この順序で)呼び出されます。–アディルフセイン
フラグメント管理メソッドの命名は、掲示板のGoogleエンジニアによると非常に混乱しています(上記のコメントを参照)。実際にどのように機能するかを理解するために、自分自身を小さなデモにした。これが私の発見です。私が間違っている場合は、遠慮なく訂正してください。
最初にフラグメントをアクティビティに追加するには、getFragmentManager()。beginTransaction()。add(R.id.container、mFragment).commit()を使用します。
これにより、アクティビティがフラグメントに関連付けられ、ビューもフラグメントに関連付けられます。
結果のライフサイクルイベントとその他の重要なメソッドの戻り値は次のとおりです。
onAttach()
onCreate()
onCreateView()
onViewCreated()
onActivityCreated()
onViewStateRestored()
onStart()
onResume()
mFragment.getView() == null: false
mFragment.getActivity() == null: false
アクティビティからフラグメントを削除するには、getFragmentManager()。beginTransaction()。remove(mFragment).commit()を使用します。
これにより、ビューまたはアクティビティへの関連付けが削除されます。
結果のライフサイクルイベントとその他の重要なメソッドの戻り値は次のとおりです。
onPause()
onStop()
onDestroyView()
onDestroy()
onDetach()
mFragment.getView() == null: true
mFragment.getActivity() == null: true
ここにフラグメントを再度追加しました
追加したフラグメントをアクティビティからデタッチするには、getFragmentManager()。beginTransaction()。detach(mFragment).commit()を使用します。
これにより、ビューとの関連付けは削除されますが、アクティビティとの関連付けは維持されます。
結果のライフサイクルイベントとその他の重要なメソッドの戻り値は次のとおりです。
onPause()
onStop()
onDestroyView()
mFragment.getView() == null: true
mFragment.getActivity() == null: false
アクティビティにデタッチされたフラグメントを再アタッチするには、getFragmentManager()。beginTransaction()。attach(mFragment).commit()を使用します。
これにより、フラグメントに関連付ける新しいビューが作成され、アクティビティの関連付けが維持されます。
結果のライフサイクルイベントとその他の重要なメソッドの戻り値は次のとおりです。
onCreateView()
onViewCreated()
onActivityCreated()
onViewStateRestored()
onStart()
onResume()
mFragment.getView() == null: false
mFragment.getActivity() == null: false
注意すべきその他の重要事項:Fragmentをデタッチしてから、attach()ではなくadd()を使用して再度追加しようとした場合、何も変更されていないようです。
add()ではなくattach()を使用して、remove()を使用して削除されたフラグメントを追加しようとした場合、何も変更されていないようです。
getView()がnullを返すとき、フラグメントはまだ、最後に作成したビューへの内部参照を持っている可能性があります。このビューは有効ではなくなったため、使用しないでください。
Fragment
がdetachedの場合、そのonPause
、onStop
およびonDestroyView
メソッドが(この順序で)のみ呼び出されることがわかります。一方、Fragment
さ除去の、onPause
、onStop
、onDestroyView
、onDestroy
及びonDetach
(そのために)メソッドが呼び出されます。同様に、付着、Fragment
のをonCreateView
、onStart
およびonResume
方法がのみ呼び出されます。場合や追加、Fragment
のはonAttach
、onCreate
、onCreateView
、onStart
およびonResume
方法は、(この順番で)と呼ばれます。