2012-02-06 74 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