用來對 Fragment 做許多操作(載入、刪除、顯示、隱藏…等等)
每個新的實例化的 FragmentTransaction 對 Fragment 做的一連串操作稱為一組 transaction
透過前面介紹的 FragmentManager 的 beginTransaction() 方取得
val transaction = manager.beginTransaction()
以下為 FragmentTransaction 中的方法
add
在 Activity 中載入 Fragment
從 Fragment 生命週期 onAttach() 階段開始執行
已經載入的 Fragment 不能再次執行 add 方法(因為已存在)
add (containerViewId: Int, fragment: Fragment, tag: String)
containerViewId:用來做為 Fragment 的 container 的 id
fragment:想要載入的 Fragment(實例化的 Fragment Class)
tag:想為這個載入的 Fragment 設置的 tag
add (containerViewId: Int, fragment: Fragment)
若不想為載入的 Fragment 設置 tag 可用此方法
add (fragment: Fragment, tag: String)
此方法等同於第一個方法設置 container id 為 0 。
可在 Fragment 不需要被顯示出來時使用。
#什麼情況會需要不被顯示出來的 Fragment 呢?
當你需要背景作業的時候,便可使用無 UI 的 Fragment。
(那些透過 AsyncTask 或其他 Thread 執行的作業)
由於這樣的 Fragment 與 Activity 的 View 沒有關聯(沒有 UI),所以當 Activity 因某些因素被重啟時(例如螢幕旋轉),Fragment 不需要重新執行 onCreateView() 這個方法,因此當背景作業完成後仍能找到原本的 View 並回傳。
(若背景作業執行過程中 View 被銷毀並重建,背景作業執行完後將找不到原本的 View 回傳結果,就會出錯)
# 官方文件參考("新增不顯示 UI 的片段"段落)
# stackflow 回答參考
remove
將 Fragment 移除
Fragment 將被銷毀,生命週期會執行到 onDetach() 階段
移除後可透過 add 方法再次載入 Fragment
replace
替換 container 中的 Fragment
相當於 remvoe + add
remove 原本 container 中的 Fragment 再 add 新的 Fragment
replace (containerViewId: Int, fragment: Fragment, tag: String)
containerViewId:想替換 Fragment 的 container id
fragment:想載入的新 Fragment
tag:為新載入的 Fragment 設置 tag
replace (containerViewId: Int, fragment: Fragment)
若不想為載入的 Fragment 設置 tag 可用此方法
show & hide
show 和 hide 方法其實是對 Fragment 源碼中的一個 Boolean 參數 mHidden 做變更
Fragment 的 View 會依據 mHidden 的值設置為 VISIBLE 或 GONE
因此 Fragment 的生命週期不會有變動
將 mHidden 設為 false,Fragment 的 View 設為 VISIBLE,顯示 Fragment
show (fragment: Fragment)
hide
將 mHidden 設為 true,Fragment 的 View 設為 GONE,隱藏 Fragment
hide (fragment: Fragment)
基於 show 和 hide 的執行原理,當我們在切換 Fragment 時,最合理的作法為 show 要顯示的 Fragment 並 hide 其他的 Fragment
只做 show 的話會變成 所有 show 過的 Fragment 的 View 都是 VISIBLE 狀態
再重複執行 show 的話將不會有變動
將 Fragment 從 UI 中移除
detach (fragment: Fragment)
類似於將 Fragment 加進 back stack 的狀態:
Fragment 從 UI 中被移除且銷毀 Fragment 的 View
但 FragmentManager 仍會維護該 Fragment 的狀態
Fragment 的生命週期將執行到 onDestroyView() 階段
將 Fragment 重新附加至 UI
attach (fragment: Fragment)
將用 detach 方法移除的 Fragment 的 View 重新建立並將 Fragment 重新附加至 UI 顯示
將從 Fragment 生命週期的 onCreatView() 階段開始執行
將 transaction 設置的一系列操作
晚點續補...
Android
Kotlin
FragmentTransaction``BottomNavigationView