iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 11
0
Software Development

英國研究顯示,連續30天用Kotlin開發Android將有益於身心健康系列 第 11

Android Kotlin 實作 Day 8:BottomNavigation(下)(FragmentTransaction + BottomNavigationView)

<< 接續上篇

Method


FragmentTransaction

用來對 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 移除

    remove (fragment: Fragment)

    • Fragment 將被銷毀,生命週期會執行到 onDetach() 階段

    • 移除後可透過 add 方法再次載入 Fragment

  • replace

    替換 container 中的 Fragment
    相當於 remvoe + add

    remove 原本 container 中的 Fragment 再 add 新的 Fragment

  • show & hide

    show 和 hide 方法其實是對 Fragment 源碼中的一個 Boolean 參數 mHidden 做變更
    Fragment 的 View 會依據 mHidden 的值設置為 VISIBLE 或 GONE
    因此 Fragment 的生命週期不會有變動

    • show

      將 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 的話將不會有變動

  • detach

    將 Fragment 從 UI 中移除

    detach (fragment: Fragment)

    • 類似於將 Fragment 加進 back stack 的狀態:

      Fragment 從 UI 中被移除且銷毀 Fragment 的 View
      但 FragmentManager 仍會維護該 Fragment 的狀態

    • Fragment 的生命週期將執行到 onDestroyView() 階段

  • attach

    將 Fragment 重新附加至 UI

    attach (fragment: Fragment)

    • 將用 detach 方法移除的 Fragment 的 View 重新建立並將 Fragment 重新附加至 UI 顯示

    • 將從 Fragment 生命週期的 onCreatView() 階段開始執行

  • commit

    將 transaction 設置的一系列操作

  • addToBackStack

    晚點續補...

查看詳細 Code > GitHub

tags: Android Kotlin FragmentTransaction``BottomNavigationView

上一篇
Android Kotlin 實作 Day 8:BottomNavigation(中)(Fragment Class 與 FragmentManager)
下一篇
Android - Activity 啟動模式
系列文
英國研究顯示,連續30天用Kotlin開發Android將有益於身心健康30

尚未有邦友留言

立即登入留言