天天看點

activity調用fragment的方法_Fragment 的現在以及未來

activity調用fragment的方法_Fragment 的現在以及未來

大家還記得 Fragment 是什麼時候釋出的嗎?在 2011 年 Google 釋出 Android 3.0,伴随着 API 11 推出了 Fragment 元件,最初 Fragment 是為了優化 Android 平闆頁面結構而推出的,不幸的是 Android 平闆現在幾乎夭折了,連 Google 都放棄了 Android 平闆的研發。

是以一直以來,Fragment 處于一種很尴尬的地位,API 難用、坑很多、生命周期難管理,是以當初有人提出 Activity 應該采取單 Activity + 多 Fragment 的結構開發時,很多人都持否定态度,不過最近 Google Play 也改成了這種結構,日常使用體驗也還好。

activity調用fragment的方法_Fragment 的現在以及未來

不過自從 Android 平闆上夭折之後,Fragment 的作用越來越向一個微型 Activity 發展,Activity 有什麼方法 Fragment 中就要對應添加什麼方法,發向 Activity 的事件回調也要向 Fragment 中發一遍。最初的想法是想 Fragment 解決 Activity 頁面臃腫以及不靈活的問題,但是沒想到如今 Fragment 變成了 Activity。

activity調用fragment的方法_Fragment 的現在以及未來

針對目前存在的問題,官方提出了重新設計 Fragment 的計劃,并提出了以下兩個目标:

1. 将 Fragment 遷移到一個聚焦 API 層面的世界,并具有可預見、完善的表現。 2. 相容目前的功能

在未來的某個時間的,Google 會釋出 Fragment 2.0,會添加一些新的 API 供大家使用,是以作為開發者的我們,需要密切關注正在使用的 Fragment API 中哪些被打上了棄用的标簽,因為在 Fragment 2.0 釋出之後,這些 API 會逐漸變得不可用。

現在的 Fragment

activity調用fragment的方法_Fragment 的現在以及未來
activity調用fragment的方法_Fragment 的現在以及未來

為了更友善的在 Fragment 中進行 UI 測試,Google 提供了 FragmentScenario UI 測試架構,使我們可以不依附于 Activity 單獨測試 Fragment 的功能,同時也提供了 moveToState()、recreate() 等方法來測試生命周期變化時,Fragment 功能是否正常。

activity調用fragment的方法_Fragment 的現在以及未來

在目前的 1.1.0 版本中,還提供了 FragmentFactory 幫助我們自定義 Fragment 的執行個體化。之前我們可能會有一個疑問:為什麼 Fragment 需要使用 setArguments 來傳遞參數,而不可以直接從 Fragment 的構造方法傳遞參數?答案很簡單,會資料丢失。

因為例如當我們反轉螢幕的時候,Activity 會銷毀重建,目前 Activity 持有的 Fragment 會通過 FragmentManager 重建,但 FragmentManager 隻會調用 Fragment 預設的構造方法重建,是以我們通過自定義構造方法傳遞的參數就會丢失。

現在我們可以通過 FragmentFactory 來自定義的執行個體化,就可以避免上述問題的發生。

activity調用fragment的方法_Fragment 的現在以及未來

自定義 FragmentFactory 之後,需要在 onCreate 之前給 FragmentManager 提前指派。

activity調用fragment的方法_Fragment 的現在以及未來

在 Fragment 1.2.0 版本中,增加來新的 FragmentContainerView 來替代之前使用的 <FramLayout> 和 <framgnet> 标簽。FragmentContainerView 在 Fragmnet 出現、消失的動畫上面增加了 Z 軸上的效果。

activity調用fragment的方法_Fragment 的現在以及未來

增加了 OnBackPressedDispatcher 來幫助我們在 Fragmnet 中更好的處理傳回事件。

activity調用fragment的方法_Fragment 的現在以及未來

還有一些優化方面的更新,在 Fragment 中更友善的執行個體化不同作用域的 viewModel,例如僅 Fragment、全部 Navigation 作用域、Activity 作用域。同時在 FragmentPagerAdapter 中增加了 BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 屬性,表示隻有目前 Fragment 可以走到 onResume,這樣一來我們做 ViewPager 多個 Fragment 懶加載是就友善了很多。

未來的 Fragment

activity調用fragment的方法_Fragment 的現在以及未來

未來官方期望可以實作多個棧的 Fragment 狀态管理,而不是像現在僅單一棧的管理,如果你目前正在基于 Android Arch Component 中的 Navigation 配合 BottomNavigationView(底部導航欄)寫 App 的話,你應該明白目前這種結構的 Fragment 棧管理是多麼痛苦。

activity調用fragment的方法_Fragment 的現在以及未來

這是官方自己實作的多個棧管理代碼,在 GitHub 上面的 navigationadvancedsample 倉庫中,有興趣的可以自己研究下。

activity調用fragment的方法_Fragment 的現在以及未來

在未來官方還期望可以提供一種更好的 API 來代替 startActivityForResult 實作 Fragment 之間結果的傳遞。

activity調用fragment的方法_Fragment 的現在以及未來

最後官方還期望可以整合 Fragment 和 Fragment‘s View 的生命周期,提供更友善的狀态管理。

其實在我看來之前 Fragment 之是以難用,是因為當時設計它的原因是基于平闆模式所設計的,如今 Google 移除來 support 引入來全新的 AndroidX,将主要 API 的更新脫離 Android 版本的更新,勢必會加快 API 的更新疊代速度,向着更快、更友善的開發體驗前進,而且我也預感 Android 會在未來 1-2 年内會有重大的變化和突破,可以提供給使用者媲美 iOS 的使用體驗。是以抓緊上車,學就對了!

明天周末暫停更新,下周一我們繼續為大家分享 Android Dev Summit 中有趣的内容!沒關注的小夥伴記得關注訂閱鴨!如果覺得這些文章有點意思,記得分享轉發評論點贊鴨!

我是 wanbo 大家加油!

activity調用fragment的方法_Fragment 的現在以及未來

繼續閱讀