iT邦幫忙

2022 iThome 鐵人賽

DAY 9
0

筆者寫到這邊,其實一直在猶豫要不要再繼續深入介紹FragmentManager。是不是要先丟出 Activity 的 lifecycle 流程圖來把主題拉回來。

但官方文件花了蠻大的篇幅介紹FragmentManager,而且筆者作品所使用的ViewPager2,跟FragmentManager也有很大的關聯。然後筆者在開發階段對 Fragment 的功用的確不甚熟悉,連帶影響到對其 lifecycle 的理解。決定先往下繼續介紹到 "Using the FragmentManager" 這個段落。

使用 FragmentManager

FragmentManager管理 Fragment 的背景堆疊 / 背景堆棧(back stack)。運行時,FragmentManager會執行背景堆棧(back stack)操作,像是添加、移除 Fragment,以回應使用者操作。每組更動都作為一個單元(a single unit)來提交(committed),這一個單元被稱作FragmentTransaction。相關深入討論詳見 fragment transactions 概覽 (官方文件)

當使用者按下裝置的返回鍵,或當你調用FragmentManager.popBackStack()時,最頂端的 fragment transaction 從背景堆棧(back stack)中被移除。也就是說,fragment transaction 被反轉。如果在背景堆棧(back stack)中沒有其他的 fragment transaction,並且你沒有使用子 Fragment,則返回事件泡泡會上浮至 Activity。如果有使用子 Fragment,請參閱子 Fragment 與兄弟 Fragment 的留意事項 (官方文件)

當你在 fragment transaction 身上調用addToBackStack(),請留意 fragment transaction 會包含任何數量的操作。例如添加多個 Fragment、在多個容器(containers)中替換 Fragment 等等。當背景堆棧(back stack)彈出(popped),所有 fragment transaction 的操作,都被反轉為一個原子操作(single atomic action)。如果在調用addToBackStack()前,提交了其他 fragment transaction 的popBackStack(),並且使用該addToBackStack()的 fragment transaction,這些操作不會被反轉。因此,在一個FragmentTransaction中,應避免會影響背景堆棧和不影響背景堆棧的 fragment transaction 交錯使用。


參考資料


上一篇
[Day 08] Fragment 的實作 - Fragment manager / 子 Fragment 與父級的互動
下一篇
[Day 10] Fragment 的實作 - Fragment manager / 子 Fragment 與兄弟 Fragment 的留意事項
系列文
[Android] 在 activity 與 fragment 身上的 lifecycle30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言