在安卓文档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