1. 程式人生 > >FragmentTransaction與Fragment生命週期的關係

FragmentTransaction與Fragment生命週期的關係

在Android中,對Fragment的操作都是通過FragmentTransaction來執行。而從Fragment的結果來看,FragmentTransaction中對Fragment的操作大致可以分為兩類:

顯示:add() replace() show() attach()
隱藏:remove() hide() detach()

對於每一組方法,雖然最後產生的效果類似,但方法背後帶來的副作用以及對Fragment的生命週期的影響都不盡相同。
add() vs. replace()

只有在Fragment數量大於等於2的時候,呼叫add()還是replace()的區別才能體現出來。當通過add()連續兩次新增Fragment的時候,每個Fragment生命週期中的onAttach()-onResume()都會被各呼叫一次。

這裡寫圖片描述

同樣,退出Activty時,每個Fragment生命週期中的onPause()-onDetach()也會被各呼叫一次。

這裡寫圖片描述

但當使用replace()來新增Fragment的時候,第二次新增會導致第一個Fragment被銷燬,即執行第二個Fragment的onAttach()方法之前會先執行第一個Fragment的onPause()-onDetach()方法。

這裡寫圖片描述

show() & hide() vs. attach() & detach()

呼叫show() & hide()方法時,Fragment的生命週期方法並不會被執行,僅僅是Fragment的View被顯示或者​隱藏。而且,儘管Fragment的View被隱藏,但它在父佈局中並未被分離,仍然存在著。相比較下,一旦一個Fragment被detach(),它的onPause()-onDestroyView()週期都會被執行。同時Fragment的View也會被分離。

這裡寫圖片描述

在重新呼叫attach()後,onCreateView()-onResume()週期也會被再次執行。

這裡寫圖片描述

remove()

其實看完上面的分析,remove()方法基本也就明白了。detach()方法執行onPause()-onDestroyView()的生命週期,而remove()就是完成onPause()-onDetach()週期。多了個onDetach()生命週期。

這裡寫圖片描述