What's the difference between detaching a Fragment and removing it?

在针对 片段交易的 Android 文档中,我注意到两个非常相似的方法: detachremove。那里的描述似乎并没有提供多少关于何时使用它们的洞察力,而且据我所知,它们似乎是一样的。

那么,这两种方法有什么不同呢?

60419 次浏览

分离方法从 UI 中删除片段,但其状态由片段管理器维护。这意味着您可以通过使用修改后的视图层次结构调用 attatchmethod 来重用这个片段

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

来源评论

您会注意到,当一个片段被分离时,它的 onPuse、 onStop 和 onDestroyView 方法只被调用(按照这个顺序)。另一方面,当一个片段被删除时,它的 onPace、 onStop、 onDestroyView、 onDestroy 和 onDetach 方法将被调用(按照这个顺序)。类似地,在附加时,只调用片段的 onCreateView、 onStart 和 onResume 方法; 在添加时,调用片段的 onAttach、 onCreate、 onCreateView、 onStart 和 onResume 方法(按照这个顺序)。-阿迪尔 · 侯赛因

片段管理方法的命名非常混乱,甚至根据 Google 工程师在留言板上的说法(见上面的评论)。我给自己做了一个小样本来弄清楚事情是怎么运作的。这是我的发现。如果我错了,你可以纠正我。

为了最初向活动添加一个片段,您可以使用: GetFragmentManager () . startTransaction () . 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().

This removes any association with a View or to an Activity.

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

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


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

我在这里重新加入了碎片

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

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

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

onPause()
onStop()
onDestroyView()


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

要重新附加分离到活动的片段,请使用: GetFragmentManager()。初始事务()。附加(mFragment)。提交()。

这将创建一个与片段关联的新视图,并维护活动关联。

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

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


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

Other important things to note: 如果您分离了一个片段,然后尝试使用 add ()而不是 add ()再次添加它,那么似乎什么都没有改变。

如果您试图通过使用 atta ()而不是 add ()来添加一个已经使用 move ()删除的片段,那么似乎什么都没有改变。

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