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

时间:2012-02-06 06:33:06

标签: android android-fragments

FragmentTransaction的Android文档中,我注意到两种非常相似的方法:detachremove。那里的描述似乎没有提供关于何时使用每个的详细信息,并且从我可以看出它们看起来是相同的。

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

2 个答案:

答案 0 :(得分:146)

detach方法从UI中删除片段,但其状态由片段管理器维护。这意味着您可以通过使用修改后的ViewHierarchy

调用attach方法来重用此片段

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

来源评论

您会注意到,当分离片段时,仅调用onPause,onStop和onDestroyView方法(按此顺序)。另一方面,当删除片段时,将调用其onPause,onStop,onDestroyView,onDestroy和onDetach方法(按此顺序)。类似地,在附加时,Fragment的onCreateView,onStart和onResume方法仅被调用;添加时,会调用Fragment的onAttach,onCreate,onCreateView,onStart和onResume方法(按此顺序)。 - Adil Hussain

答案 1 :(得分:52)

即使根据留言板上的Google工程师,片段管理方法的命名也非常混乱(参见上面的评论)。我做了一个小小的演示来弄清楚事情是如何运作的。以下是我的发现。如果我错了,请随意纠正我。

要最初将片段添加到活动,您可以使用: getFragmentManager()。beginTransaction()。add(R.id.container,mFragment).commit()。

它将Activity与Fragment相关联,并将View与Fragment相关联。

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

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

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

要从活动中删除片段,请使用: getFragmentManager()。的BeginTransaction()。除去(mFragment).commit()。

这将删除与View或Activity的任何关联。

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

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

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

我在这里重新添加了片段

要从活动中分离添加的片段,请使用: getFragmentManager()。的BeginTransaction()。分离(mFragment).commit()。

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

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

onPause()                             
onStop()                              
onDestroyView()                      

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

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

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

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

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

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

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

如果您尝试使用attach()而不是add()添加使用remove()删除的Fragment,则似乎没有任何更改。

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