[英]Fragment methods: attach(), detach(), remove(), replace(), popBackStack()
我對這些功能和它們的目的非常困惑。 我觀察到使用replace()
用新的片段替換現有的片段。 我們可以使用addToBackStack(null)
將該片段放在后面的堆棧中,這樣我們就可以回到之前顯示的片段了。 現在,當添加(或替換)片段時 - onAttach()
- > onCreate()
etc ....片段的方法按順序調用。
現在當我們從我們的活動調用片段上的remove()
時,調用片段的哪些函數以及以哪種順序調用?
attach()
和detach()
什么作用? detach()
是否刪除了片段? 當使用這兩個attach()
和detach()
,會調用片段的哪些函數以及以哪種順序調用?
另外, popBackStack()
會發生什么? 我的意思是當我們在活動的片段上使用popBackStack()
時調用哪些函數?
什么時候onDestroy()調用?
謝謝。
現在當我們從我們的活動調用片段上的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()
生命周期方法,在分離時,會在Fragment
調用onDetach()
生命周期方法。 有關更多信息,請查看上面的鏈接。
另外,popBackStack()會發生什么? 我的意思是當我們在活動的片段上使用popBackStack()時調用哪些函數?
如果Fragment
尚未被銷毀,那么在popBackStack()
上onStart()
和onResume()
方法。 如果先前已經破壞了Fragment
,那么將從onAttach()
開始調用生命周期方法。 當你按下Activities
上的后退按鈕時,它就是一樣的。
關於popBackStack()
一個注釋。 它不彈出片段,它會彈出片段事務。 因此無論最后一個片段事務是什么都被顛倒了 如果您正在顯示FragmentA
並且您的交易是:
fragmentTransaction.replace(R.id.your_layout, fragmentB);
fragmentTransaction.addToBackStack(null);
它將使用FragmentB
替換FragmentA
,並將該事務(不是片段)添加到后端堆棧。 如果你然后點擊后退按鈕,它會彈出后面的堆棧並獲得事務,即“用FragmentA
替換這個FragmentB
”。 然后它反轉該交易。 向后,該指令是用FragmentA
替換當前片段的任何內容。 如果原始FragmentA
仍然存在,則使用該FragmentA
。 如果它被摧毀了,它會成為一個新的。
假設使用以下步驟將片段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時,片段再次創建並恢復了視圖?
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.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.