Fragment 的如今以及將來

你們還記得 Fragment 是何時發佈的嗎?在 2011 年 Google 發佈 Android 3.0,伴隨着 API 11 推出了 Fragment 組件,最初 Fragment 是爲了優化 Android 平板頁面結構而推出的,不幸的是 Android 平板如今幾乎夭折了,連 Google 都放棄了 Android 平板的研發。

因此一直以來,Fragment 處於一種很尷尬的地位,API 難用、坑不少、生命週期難管理,因此當初有人提出 Activity 應該採起單 Activity + 多 Fragment 的結構開發時,不少人都持否認態度,不過最近 Google Play 也改爲了這種結構,平常使用體驗也還好。markdown

不過自從 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 會逐步變得不可用。spa

如今的 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 默認的構造方法重建,因此咱們經過自定義構造方法傳遞的參數就會丟失。3d

如今咱們能夠經過 FragmentFactory 來自定義的實例化,就能夠避免上述問題的發生。code

自定義 FragmentFactory 以後,須要在 onCreate 以前給 FragmentManager 提早賦值。orm

在 Fragment 1.2.0 版本中,增長來新的 FragmentContainerView 來替代以前使用的 和 標籤。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 中有趣的內容!沒關注的小夥伴記得關注我以及個人公衆號【Android丨Kotlin】!若是以爲這些文章有點意思,記得分享轉發評論點贊鴨!

我是 wanbo 你們加油!

相關文章
相關標籤/搜索