在安卓文檔FragmentTransaction中,我注意到兩個非常類似的方法:detach
和remove
。那裏的描述似乎沒有提供關於什麼時候使用每一個的洞察,並且從我可以告訴他們看起來是相同的。分離片段並刪除它有什麼區別?
所以:這兩種方法有什麼區別?
在安卓文檔FragmentTransaction中,我注意到兩個非常類似的方法:detach
和remove
。那裏的描述似乎沒有提供關於什麼時候使用每一個的洞察,並且從我可以告訴他們看起來是相同的。分離片段並刪除它有什麼區別?
所以:這兩種方法有什麼區別?
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
即使根據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的內部引用。此視圖不再有效,不應使用。
很好的工作。但是,在刪除片段後,嘗試重新添加和重新添加具有相同的效果似乎很有趣。 – zgulser 2016-10-21 11:50:35
所以原來,「attach()」不會調用onAttach()。 「detach()」不會調用onDetach()。 – 2017-08-16 22:46:43
要添加到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
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
一個人比另一個人有什麼好處?我想知道一個用例比另一個更有用嗎?我總是添加和刪除,是不是很糟糕? – 2016-08-14 03:04:56