2012-02-06 45 views

回答

135

detach方法從UI中刪除片段,但其狀態由Fragment Manager維護。這意味着您可以通過調用attach方法重新使用此片段,並使用修改後的ViewHierarchy

Remove表示片段實例不能重新連接。您將不得不再次將其添加到片段事務中。

來源評論

你會發現,當一個片段被分離,它的onPause,和的onStop方法onDestroyView只能稱爲(按順序)。另一方面,當一個片段被移除時,onPause,onStop,onDestroyView,onDestroy和onDetach方法被調用(按照該順序)。同樣,在附加時,Fragment的onCreateView,onStart和onResume方法僅被調用;並且在添加時,片段的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方法被調用時(按照該順序)。 – 2012-06-26 10:46:33

+0

Diane Hackborn [此處]有一個快速問答(https://groups.google.com/forum/#!topic/android-platform/QlkLMsncDwg)。 那麼,爲什麼我有[此](http://stackoverflow.com/questions/18238214/stop-oncreateoptionsmenu-to-be-called-from-detached-fragment)日誌? 你怎麼知道FT.detach()被調用? – Poutrathor 2013-08-16 08:07:26

+0

一個人比另一個人有什麼好處?我想知道一個用例比另一個更有用嗎?我總是添加和刪除,是不是很糟糕? – 2016-08-14 03:04:56

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 

要從活動中刪除片段,您可以使用: getFragmentManager()調用BeginTransaction()刪除(mFragment)。承諾()。

這將刪除與視圖或活動的關聯。

這裏是產生生命週期事件和其他重要的方法的返回值:

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

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

我重新添加此片段

要從活動分離的添加片段,您可以使用: getFragmentManager ().beginTransaction()。分離(mFragment).commit()。

這將刪除與視圖的任何關聯,但保持與活動的關聯。

這裏是產生生命週期事件和其他重要的方法的返回值:

onPause()        
onStop()        
onDestroyView()      

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

重新連接這是分離到的活性的片段,您可以使用: getFragmentManager()的BeginTransaction()。附加(mFragment).commit()。

這會創建一個新的視圖來關聯片段並維護活動關聯。

這裏是產生生命週期事件和其他重要的方法的返回值:

onCreateView()       
onViewCreated()      
onActivityCreated()     
onViewStateRestored()     
onStart()        
onResume()        

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

其他重要的事情需要注意: 如果分離片段,然後嘗試再次添加使用add(),而不是附加(),似乎沒有改變。

如果您嘗試使用attach()而不是add()來添加使用remove()移除的片段,則似乎沒有任何更改。

當getView()返回null時,Fragment仍可能具有對其創建的最後一個View的內部引用。此視圖不再有效,不應使用。

+0

很好的工作。但是,在刪除片段後,嘗試重新添加和重新添加具有相同的效果似乎很有趣。 – zgulser 2016-10-21 11:50:35

+1

所以原來,「attach()」不會調用onAttach()。 「detach()」不會調用onDetach()。 – 2017-08-16 22:46:43

相關問題