片段方法:attach(),detach(),remove(),replace(),popBackStack()

时间:2012-08-28 06:52:14

标签: android android-fragments fragment back-stack

我对这些功能与其目的非常困惑。我观察到使用replace()替换现有片段的新片段。我们可以使用addToBackStack(null)将该片段放在后面的堆栈中,这样我们就可以回到之前显示的片段了。现在,当添加(或替换)片段时 - onAttach() - > onCreate()等......片段的方法按顺序调用。

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

attach()detach()做了什么? detach()删除片段吗?当使用这两个attach()detach()时,会调用片段的哪些函数以及按哪种顺序??

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

onDestroy()何时调用?

谢谢。

3 个答案:

答案 0 :(得分:24)

  

现在当我们从我们的活动调用片段上的remove()时,调用片段的哪些函数以及按哪种顺序?

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

订单为:onPause()onStop()onDestroyView()onDestroy()onDetach()

  

attach()和detach()有什么作用? detach()是否删除了片段?当使用这两个attach()和detach()时,调用片段的哪些函数以及按哪种顺序??

attach()detach()分别将FragmentActivity关联或分离。附加Fragment时,将调用onAttach()生命周期方法,在分离时,onDetach()生命周期方法将在Fragment中调用。有关更多信息,请查看上面的链接。

  

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

如果Fragment尚未销毁,则在popBackStack()上调用onStart()onResume()方法。如果之前已销毁Fragment,则将从onAttach()开始调用生命周期方法。当你按下Activities上的后退按钮时,它就是一样。

答案 1 :(得分:12)

关于popBackStack()的说明。它不弹出片段,它会弹出片段事务。因此无论最后一个片段事务是什么都被颠倒了如果您显示FragmentA并且您的交易是:

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

它会用FragmentA替换FragmentB,并将该事务(不是片段)添加到后台堆栈。然后,如果您点击后退按钮,它会弹出后台堆栈并获取交易,即“将此FragmentA替换为FragmentB”。然后它反转该交易。向后,该指令是用FragmentA替换当前片段的任何内容。如果原始FragmentA仍然存在,则使用该原始{{1}}。如果它被摧毁了,它会成为一个新的。

答案 2 :(得分: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:添加片段B时,使用了replace()和addToBackStack(),因此从容器中删除了所有片段,并将片段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.