我对这些功能与其目的非常困惑。我观察到使用replace()
替换现有片段的新片段。我们可以使用addToBackStack(null)
将该片段放在后面的堆栈中,这样我们就可以回到之前显示的片段了。现在,当添加(或替换)片段时 - onAttach()
- > onCreate()
等......片段的方法按顺序调用。
现在当我们从我们的活动中调用片段remove()
时,调用片段的哪些函数以及按哪种顺序?
attach()
和detach()
做了什么? detach()
删除片段吗?当使用这两个attach()
和detach()
时,会调用片段的哪些函数以及按哪种顺序??
另外,popBackStack()
会发生什么?我的意思是当我们对活动中的片段使用popBackStack()
时调用哪些函数?
onDestroy()何时调用?
谢谢。
答案 0 :(得分:24)
现在当我们从我们的活动调用片段上的remove()时,调用片段的哪些函数以及按哪种顺序?
请看http://developer.android.com/reference/android/app/Fragment.html。
订单为:onPause()
,onStop()
,onDestroyView()
,onDestroy()
,onDetach()
attach()和detach()有什么作用? detach()是否删除了片段?当使用这两个attach()和detach()时,调用片段的哪些函数以及按哪种顺序??
attach()
和detach()
分别将Fragment
与Activity
关联或分离。附加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.