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

yyd*_*ydl 111 android android-fragments

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

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

Raj*_*Dua 151

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

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

来源评论

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

  • 要添加到Rajdeep的答案,您会注意到当`Fragment`是_detached_时,它的`onPause`,`onStop`和`onDestroyView`方法只被调用(按此顺序).另一方面,当`Fragment`是_removed_时,它的`onPause`,`onStop`,`onDestroyView`,`onDestroy`和`onDetach`方法被调用(按此顺序).类似地,当_attaching_时,只调用`Fragment`的`onCreateView`,`onStart`和`onResume`方法; 当_adding_时,调用`Fragment`的`onAttach`,`onCreate`,`onCreateView`,`onStart`和`onResume`方法(按此顺序). (142认同)
  • Diane Hackborn [这里](https://groups.google.com/forum/#!topic/android-platform/QlkLMsncDwg) 有一个快速问答。那么为什么我有 [this](http://stackoverflow.com/questions/18238214/stop-oncreateoptionsmenu-to-be-Called-from-detached-fragment) 日志?你怎么知道 FT.detach() 已被调用? (2认同)
  • 一个比另一个有什么好处?我想知道一个用例优于另一个的用例吗?我总是添加和删除,那不好吗? (2认同)

Ste*_*hen 52

即使根据留言板上的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
Run Code Online (Sandbox Code Playgroud)

要从活动中删除片段,请使用:getFragmentManager().beginTransaction().remove(mFragment).commit().

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

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

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

mFragment.getView() == null: true
mFragment.getActivity() == null: true
Run Code Online (Sandbox Code Playgroud)

我在这里重新添加了片段

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

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

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

onPause()                             
onStop()                              
onDestroyView()                      

mFragment.getView() == null: true
mFragment.getActivity() == null: false
Run Code Online (Sandbox Code Playgroud)

要重新附加分离到Activity的Fragment,可以使用:getFragmentManager().beginTransaction().attach(mFragment).commit().

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

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

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

mFragment.getView() == null: false
mFragment.getActivity() == null: false
Run Code Online (Sandbox Code Playgroud)

其他需要注意的重要事项:如果您分离Fragment然后尝试使用add()而不是attach()再次添加它,则似乎没有任何变化.

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

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

  • 所以事实证明"attach()"不会调用onAttach()."detach()"不会调用onDetach(). (7认同)