拆分Fragment和删除它有什么区别?

在FragmentTransaction的Android文档中,我注意到了两个非常相似的方法: detachremove 。 在那里的描述似乎没有提供什么时候使用每个,并从我可以告诉他们似乎是相同的。

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

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

删除意味着片段实例不能被重新连接。 您将不得不再次将其添加到片段事务中。

来源评论

你会注意到当一个片段被分离时,它的onPause,onStop和onDestroyView方法只被调用(按照这个顺序)。 另一方面,当一个片段被移除时,它的onPause,onStop,onDestroyView,onDestroy和onDetach方法被调用(按照这个顺序)。 同样,在附加时,片段的onCreateView,onStart和onResume方法仅被调用; 当添加时,片段的onAttach,onCreate,onCreateView,onStart和onResume方法被调用(以该顺序)。 – Adil Hussain

即使根据Google的留言板上的工程师的说法,片段pipe理方法的命名也非常混乱(请参阅上面的注释)。 我做了一个小小的演示,弄清楚事情是如何工作的。 这是我的发现。 如果我错了,请随时纠正我。

要最初将一个片段添加到一个活动中,可以使用: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()。remove(mFragment).commit()。

这将删除任何与视图或活动的关联。

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

 onPause() onStop() onDestroyView() onDestroy() onDetach() mFragment.getView() == null: true mFragment.getActivity() == null: true 

我在这里重新添加了片段

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

这将删除与视图的任何关联,但保持与活动的关联。

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

 onPause() onStop() onDestroyView() mFragment.getView() == null: true mFragment.getActivity() == null: false 

要重新附加一个与Activity分离的片段,可以使用:getFragmentManager()。beginTransaction()。attach(mFragment).commit()。

这会创build一个新的View来关联Fragment并维护Activity关联。

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

 onCreateView() onViewCreated() onActivityCreated() onViewStateRestored() onStart() onResume() mFragment.getView() == null: false mFragment.getActivity() == null: false 

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

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

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