35

我对这些功能及其用途感到非常困惑。我观察到 usingreplace()将现有片段替换为新片段。我们可以使用addToBackStack(null)将该片段放入回栈中,以便我们可以返回到之前显示的片段。现在,当添加(或替换)片段时 - onAttach()->onCreate()等....片段的方法按顺序调用。

现在,当我们remove()从我们的活动中调用片段时,片段的哪些函数被调用以及以什么顺序调用?

做什么attach()detach()做什么?是否detach()删除片段?而这两个attach()anddetach()在使用的时候,分别调用了fragment的哪些函数,按什么顺序调用??

另外,会发生什么popBackStack()popBackStack()我的意思是当我们在活动的片段上使用时调用了哪些函数?

onDestroy() 什么时候调用?

谢谢你。

4

3 回答 3

24

现在,当我们从活动中调用片段的 remove() 时,片段的哪些函数被调用以及以什么顺序调用?

查看http://developer.android.com/reference/android/app/Fragment.html

顺序为:onPause(), onStop(), onDestroyView(), onDestroy(),onDetach()

attach() 和 detach() 有什么作用?detach() 会删除片段吗?而当使用这两个attach()和detach()时,会调用fragment的哪些函数,按什么顺序调用??

attach()并且分别将与/从detach()关联或分离。附加时调用生命周期方法,分离时调用生命周期方法。有关更多信息,请查看上面的链接。FragmentActivityFragmentonAttach()onDetach()Fragment

另外,popBackStack() 上会发生什么?我的意思是当我们在活动的片段上使用 popBackStack() 时调用了哪些函数?

如果Fragment没有被销毁,则popBackStack()调用onStart()onResume()方法。如果Fragment之前已经被销毁,那么生命周期方法将从 开始调用onAttach()。与按下后退按钮时相同Activities

于 2012-08-28T07:46:30.970 回答
13

只是一个注释popBackStack()。它不会弹出片段,它会弹出片段事务。因此,无论最后一个片段交易是什么,都会被逆转。如果您显示的是 aFragmentA并且您的交易是:

fragmentTransaction.replace(R.id.your_layout, fragmentB);
fragmentTransaction.addToBackStack(null);

它将替换FragmentAFragmentB,并将该事务(不是片段)添加到后台堆栈。如果您然后点击后退按钮,它会弹出后退堆栈并获取事务,即“将其替换FragmentAFragmentB”。然后它会撤销该交易。向后,指令是将当前片段替换为FragmentA. 如果原件FragmentA仍然存在,则使用该原件。如果它被破坏了,它会制造一个新的。

于 2014-02-10T16:27:44.557 回答
4

假设通过以下步骤将片段 A 和片段 B 添加到容器中:

1. Added fragment A =>  .replace(R.id.container, fragmentA) => addToBackStack(null)
2. Added fragment B =>  .replace(R.id.container, fragmentB) => addToBackStack(null)
3. Removed fragment B => fragmentManager.popBackStack();

调用 fm.popBackStack() 时的回调:

FragmentB: onPause()
FragmentB: onStop()
FragmentB: onDestroy()
FragmentB: onDetach()
FragmentA: onCreateView()
FragmentA: onViewCreated()
FragmentA: onActivityCreated()
FragmentA: onStart()
FragmentA: onResume()

解释:为什么在使用 popBackStack() 删除和销毁片段 B 时,片段 A 视图被再次创建并恢复?

Ans:当你添加fragment B时,你使用了replace()和addToBackStack(),所以所有的fragment都被从容器中移除了,fragment B被添加到了容器中。并且,此交易也记录在 Back 堆栈中。因此,当调用 fm.popBackStack() 时,首先将事务从返回堆栈中弹出,因此操作会自行恢复,因此片段 b 会从容器中删除并销毁。并且所有其他片段都被添加,因为我们的案例片段 A 的视图被添加到容器中。还注意到片段 A 的 onAttach 和 onCreate() 没有被调用,因为它已经被创建并附加到 MainActivity 之前。

对片段 B 的后按执行相同的操作:

If you press the back button, it calls fm.popBackStack() and pops the transaction.
于 2016-02-28T10:56:44.370 回答