分离片段和删除片段有什么区别?


118

FragmentTransaction的Android文档中,我注意到了两个非常相似的方法:detachremove。那里的描述似乎并未提供有关何时使用每种描述的太多见解,从我的判断看来,它们似乎是相同的。

那么:这两种方法有什么区别?

Answers:


156

detach方法从UI删除片段,但是其状态由Fragment Manager维护。这意味着您可以通过调用带有修改后的ViewHierarchy的attach方法来重用此片段

删除意味着片段实例无法重新连接。您将不得不再次将其添加到片段事务中。

来源评论

您会注意到,当一个Fragment被分离时,其onPause,onStop和onDestroyView方法仅被调用(按该顺序)。另一方面,当删除Fragment时,将按其顺序调用其onPause,onStop,onDestroyView,onDestroy和onDetach方法。同样,在附加时,仅调用Fragment的onCreateView,onStart和onResume方法。在添加时,将按该顺序调用Fragment的onAttach,onCreate,onCreateView,onStart和onResume方法。–阿迪尔·侯赛因


145
要添加到Rajdeep的答案中,您会注意到,当a Fragment分离时,其onPauseonStoponDestroyView方法仅(按该顺序)被调用。在另一方面,当将Fragment除去,其onPauseonStoponDestroyViewonDestroyonDetach方法被调用(按该顺序)。类似地,当附接,所述FragmentonCreateViewonStartonResume方法仅调用; 而当添加FragmentonAttachonCreateonCreateViewonStartonResume方法被调用(按该顺序)。
Adil Hussain 2012年

1
有一个快速的Q&A与黛安Hackborn 在这里。那为什么我有这个日志?您怎么知道FT.detach()已被调用?
Poutrathor

1
一个人比另一个人有什么好处?我想知道一个比另一个更有利的用例吗?我总是添加和删除,这不好吗?
霓虹灯Warge

1
最好简短明了。
Robotec

55

即使根据留言板上的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()。

这将删除与View的任何关联,但保留与Activity的关联。

以下是由此产生的生命周期事件和其他重要的方法返回值:

onPause()                             
onStop()                              
onDestroyView()                      

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

要重新附加已分离到活动的片段,请使用:getFragmentManager()。beginTransaction()。attach(mFragment).commit()。

这将创建一个新的View与Fragment关联并维护Activity关联。

以下是由此产生的生命周期事件和其他重要的方法返回值:

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

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

其他需要注意的重要事项:如果分离一个Fragment,然后尝试使用add()而不是attach()再次添加它,则似乎没有什么改变。

如果您尝试通过使用attach()而不是add()来添加使用remove()删除的片段,则似乎没有任何改变。

当getView()返回null时,Fragment可能仍具有对其创建的最后一个View的内部引用。该视图不再有效,不应使用。


1
辛苦了 但是,在删除片段之后,尝试重新附加和重新添加具有相同的效果似乎很有趣。
stdout

9
因此,事实证明“ attach()”不会调用onAttach()。“ detach()”不会调用onDetach()。

1
如果将事务保留在后台,则某些生命周期事件可能会略有变化。
stdout
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.