大家還記得 Fragment 是什麼時候釋出的嗎?在 2011 年 Google 釋出 Android 3.0,伴随着 API 11 推出了 Fragment 元件,最初 Fragment 是為了優化 Android 平闆頁面結構而推出的,不幸的是 Android 平闆現在幾乎夭折了,連 Google 都放棄了 Android 平闆的研發。
是以一直以來,Fragment 處于一種很尴尬的地位,API 難用、坑很多、生命周期難管理,是以當初有人提出 Activity 應該采取單 Activity + 多 Fragment 的結構開發時,很多人都持否定态度,不過最近 Google Play 也改成了這種結構,日常使用體驗也還好。
不過自從 Android 平闆上夭折之後,Fragment 的作用越來越向一個微型 Activity 發展,Activity 有什麼方法 Fragment 中就要對應添加什麼方法,發向 Activity 的事件回調也要向 Fragment 中發一遍。最初的想法是想 Fragment 解決 Activity 頁面臃腫以及不靈活的問題,但是沒想到如今 Fragment 變成了 Activity。
針對目前存在的問題,官方提出了重新設計 Fragment 的計劃,并提出了以下兩個目标:
1. 将 Fragment 遷移到一個聚焦 API 層面的世界,并具有可預見、完善的表現。 2. 相容目前的功能在未來的某個時間的,Google 會釋出 Fragment 2.0,會添加一些新的 API 供大家使用,是以作為開發者的我們,需要密切關注正在使用的 Fragment API 中哪些被打上了棄用的标簽,因為在 Fragment 2.0 釋出之後,這些 API 會逐漸變得不可用。
現在的 Fragment
為了更友善的在 Fragment 中進行 UI 測試,Google 提供了 FragmentScenario UI 測試架構,使我們可以不依附于 Activity 單獨測試 Fragment 的功能,同時也提供了 moveToState()、recreate() 等方法來測試生命周期變化時,Fragment 功能是否正常。
在目前的 1.1.0 版本中,還提供了 FragmentFactory 幫助我們自定義 Fragment 的執行個體化。之前我們可能會有一個疑問:為什麼 Fragment 需要使用 setArguments 來傳遞參數,而不可以直接從 Fragment 的構造方法傳遞參數?答案很簡單,會資料丢失。
因為例如當我們反轉螢幕的時候,Activity 會銷毀重建,目前 Activity 持有的 Fragment 會通過 FragmentManager 重建,但 FragmentManager 隻會調用 Fragment 預設的構造方法重建,是以我們通過自定義構造方法傳遞的參數就會丢失。
現在我們可以通過 FragmentFactory 來自定義的執行個體化,就可以避免上述問題的發生。
自定義 FragmentFactory 之後,需要在 onCreate 之前給 FragmentManager 提前指派。
在 Fragment 1.2.0 版本中,增加來新的 FragmentContainerView 來替代之前使用的 <FramLayout> 和 <framgnet> 标簽。FragmentContainerView 在 Fragmnet 出現、消失的動畫上面增加了 Z 軸上的效果。
增加了 OnBackPressedDispatcher 來幫助我們在 Fragmnet 中更好的處理傳回事件。
還有一些優化方面的更新,在 Fragment 中更友善的執行個體化不同作用域的 viewModel,例如僅 Fragment、全部 Navigation 作用域、Activity 作用域。同時在 FragmentPagerAdapter 中增加了 BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 屬性,表示隻有目前 Fragment 可以走到 onResume,這樣一來我們做 ViewPager 多個 Fragment 懶加載是就友善了很多。
未來的 Fragment
未來官方期望可以實作多個棧的 Fragment 狀态管理,而不是像現在僅單一棧的管理,如果你目前正在基于 Android Arch Component 中的 Navigation 配合 BottomNavigationView(底部導航欄)寫 App 的話,你應該明白目前這種結構的 Fragment 棧管理是多麼痛苦。
這是官方自己實作的多個棧管理代碼,在 GitHub 上面的 navigationadvancedsample 倉庫中,有興趣的可以自己研究下。
在未來官方還期望可以提供一種更好的 API 來代替 startActivityForResult 實作 Fragment 之間結果的傳遞。
最後官方還期望可以整合 Fragment 和 Fragment‘s View 的生命周期,提供更友善的狀态管理。
其實在我看來之前 Fragment 之是以難用,是因為當時設計它的原因是基于平闆模式所設計的,如今 Google 移除來 support 引入來全新的 AndroidX,将主要 API 的更新脫離 Android 版本的更新,勢必會加快 API 的更新疊代速度,向着更快、更友善的開發體驗前進,而且我也預感 Android 會在未來 1-2 年内會有重大的變化和突破,可以提供給使用者媲美 iOS 的使用體驗。是以抓緊上車,學就對了!
明天周末暫停更新,下周一我們繼續為大家分享 Android Dev Summit 中有趣的内容!沒關注的小夥伴記得關注訂閱鴨!如果覺得這些文章有點意思,記得分享轉發評論點贊鴨!
我是 wanbo 大家加油!