在FragmentTransaction的Android文档中,我注意到了两个非常相似的方法:detach
和remove
。那里的描述似乎并未提供有关何时使用每种描述的太多见解,从我的判断看来,它们似乎是相同的。
那么:这两种方法有什么区别?
在FragmentTransaction的Android文档中,我注意到了两个非常相似的方法:detach
和remove
。那里的描述似乎并未提供有关何时使用每种描述的太多见解,从我的判断看来,它们似乎是相同的。
那么:这两种方法有什么区别?
Answers:
detach方法从UI删除片段,但是其状态由Fragment Manager维护。这意味着您可以通过调用带有修改后的ViewHierarchy的attach方法来重用此片段
删除意味着片段实例无法重新连接。您将不得不再次将其添加到片段事务中。
来源评论
您会注意到,当一个Fragment被分离时,其onPause,onStop和onDestroyView方法仅被调用(按该顺序)。另一方面,当删除Fragment时,将按其顺序调用其onPause,onStop,onDestroyView,onDestroy和onDetach方法。同样,在附加时,仅调用Fragment的onCreateView,onStart和onResume方法。在添加时,将按该顺序调用Fragment的onAttach,onCreate,onCreateView,onStart和onResume方法。–阿迪尔·侯赛因
即使根据留言板上的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()。remove(mFragment).commit()。
这将删除与视图或活动的任何关联。
以下是由此产生的生命周期事件和其他重要的方法返回值:
onPause()
onStop()
onDestroyView()
onDestroy()
onDetach()
mFragment.getView() == null: true
mFragment.getActivity() == null: true
我在这里重新添加了片段
要从活动中分离添加的片段,请使用:getFragmentManager()。beginTransaction()。detach(mFragment).commit()。
这将删除与View的任何关联,但保留与Activity的关联。
以下是由此产生的生命周期事件和其他重要的方法返回值:
onPause()
onStop()
onDestroyView()
mFragment.getView() == null: true
mFragment.getActivity() == null: false
要重新附加已分离到活动的片段,请使用:getFragmentManager()。beginTransaction()。attach(mFragment).commit()。
这将创建一个新的View与Fragment关联并维护Activity关联。
以下是由此产生的生命周期事件和其他重要的方法返回值:
onCreateView()
onViewCreated()
onActivityCreated()
onViewStateRestored()
onStart()
onResume()
mFragment.getView() == null: false
mFragment.getActivity() == null: false
其他需要注意的重要事项:如果分离一个Fragment,然后尝试使用add()而不是attach()再次添加它,则似乎没有什么改变。
如果您尝试通过使用attach()而不是add()来添加使用remove()删除的片段,则似乎没有任何改变。
当getView()返回null时,Fragment可能仍具有对其创建的最后一个View的内部引用。该视图不再有效,不应使用。
Fragment
被分离时,其onPause
,onStop
和onDestroyView
方法仅(按该顺序)被调用。在另一方面,当将Fragment
被除去,其onPause
,onStop
,onDestroyView
,onDestroy
和onDetach
方法被调用(按该顺序)。类似地,当附接,所述Fragment
的onCreateView
,onStart
和onResume
方法仅调用; 而当添加的Fragment
的onAttach
,onCreate
,onCreateView
,onStart
和onResume
方法被调用(按该顺序)。