2012-02-06 7 views
99

FragmentTransactionのAndroidドキュメントでは、非常によく似た2つの方法、すなわちdetachremoveに気付きました。そこの説明は、それぞれをいつ使うべきかについての多くの洞察を提供しているようではなく、私はそれらが同じであるように見えるものから見ています。フラグメントの切り離しと削除の違いは何ですか?

So:これら2つの方法の違いは何ですか?

答えて

135

detachメソッドは、フラグメントをUIから削除しますが、その状態はFragment Managerによって維持されます。これは、変更されたViewHierarchyを使用してattachメソッドを呼び出すことによってこのフラグメントを再利用できることを意味します。

Removeは、フラグメントインスタンスを再接続できないことを意味します。フラグメントトランザクションに再度追加する必要があります。

ソースコメント

あなたはフラグメントが切り離されたときに、そのonPause、onStopとonDestroyViewメソッドが(そのために)だけと呼ばれていることがわかります。一方、Fragmentが削除されると、そのonPause、onStop、onDestroyView、onDestroy、onDetachの各メソッドが呼び出されます。同様に、アタッチするとき、FragmentのonCreateView、onStartおよびonResumeメソッドは呼び出されるだけです。追加すると、FragmentのonAttach、onCreate、onCreateView、onStart、onResumeの各メソッドが(この順番で)呼び出されます。 - Adil Hussain

+134

Rajdeepの答えに追加するには、 'Fragment'が_detached_のとき、' onPause'、 'onStop'および' onDestroyView'メソッドが(その順番に)呼び出されることに気づくでしょう。一方、 'Fragment'が_removed_の場合、そのonPause、onStop、onDestroyView、onDestroy、onDetachの各メソッドが呼び出されます。同様に、_attaching_の場合、 'フラグメント'の 'onCreateView'メソッド、' onStart'メソッド、および 'onResume'メソッドは単に呼び出されます。 _adding_のとき、 'フラグメント'の 'onAttach'、' onCreate'、 'onCreateView'、' onStart'と 'onResume'メソッドが(その順序で)呼び出されます。 –

+0

Diane Hackborn [ここ](https://groups.google.com/forum/#!topic/android-platform/QlkLMsncDwg)との素早いQ&Aがあります。 なぜ[this](http://stackoverflow.com/questions/18238214/stop-oncreateoptionsmenu-to-be-called-detached-fragment)ログに記録されますか? FT.detach()が呼び出されたことをどのように知っていますか? – Poutrathor

+0

もう一方の利点は何ですか?私はユースケースを知りたいのですが、一方が好都合なケースはありますか?私はいつも追加して削除します、それは悪いですか? –

44

メッセージ管理ツールの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 

Activityからフラグメントを削除するには、使用します。 getFragmentManager()のbeginTransaction()(mFragment)を削除します。。コミット()。

これは、ビューまたはアクティビティとの関連付けを削除します。ここで

は、得られたライフサイクルイベントや他の重要なメソッドの戻り値は以下のとおりです。

onPause() 
onStop() 
onDestroyView() 
onDestroy() 
onDetach() 

mFragment.getView() == null: true 
mFragment.getActivity() == null: true 

Activityから追加フラグメントを切り離すためにここに

私は再度追加フラグメントは、使用: 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 

その他の重要なもの:あなたが断片を切断して(追加使用して再度追加しようとした場合 )ではなくattach()、何も変わっていないようです。

add()ではなくattach()を使用してremove()を使用して削除されたFragmentを追加しようとすると、何も変更されないように見えます。

getView()がnullを返すとき、Fragmentはそれが作成した最後のViewへの内部参照を引き続き持つことができます。このビューはもはや有効ではなく、使用しないでください。

+0

良い仕事。しかし、断片化が取り除かれた後も、再付着して再添加するのと同じ効果が得られるのはかなり面白かったようです。 – zgulser

+1

"attach()"はonAttach()を呼び出さないことが判明しました。 "detach()"はonDetach()を呼び出しません。 –

関連する問題