在FragmentTransaction的Android文档中,我注意到两种非常相似的方法:detach
和remove
。那里的描述似乎没有提供关于何时使用每个的详细信息,并且从我可以看出它们看起来是相同的。
那么:这两种方法有什么区别?
答案 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的内部引用。此视图不再有效,不应使用。