Fragment 使用頻率越來越高,碎片化也越來越嚴重。這就導緻了難免出現 Activity 和 Fragment ,Fragment 和 Fragment 出現通信。
Activity -> Fragment:
1. 緩存 Fragment 執行個體
2. 通過 FragmentManager
3. 通過 EventBus
4. 廣播
...
Fragment -> Activity:
1. 通過接口
2. 通過類型強制轉換 (activity as? XX)
3. 通過 EventBus
4. 廣播
...
Fragment -> Fragment:
1. 通過 Activity 中轉
2. FragmentManager
3. 通過 EventBus
4. 廣播
...
怎麼看起來都覺得很麻煩或者不夠優雅,或許還有更好的方式我不清楚而已。
但是,知道最近又出現了需要 Fragment -> Fragmen 通信後,再次開始思考有沒有更好的方式呢?
然後一頓搜尋猛如虎, 找到結果250。
部落格位址忘記了,主要是一個思路:利用 ViewModel + LiveData 來實作,也可以不用 LiveData 。
讓我們先來看下 ViewModel 的生命周期
圖檔來源:https://upload-images.jianshu.io/upload_images/4055001-9f82ba3d02428194.png
可以看到 ViewModel 的生命周期貫穿了整個 Activity ,跟 Activity 一緻。
是以,我們在 Activity 中建立的 ViewModel ,跟我們的 Fragment 中建立的 ViewModel 是同一個 ViewModel 類型, 那麼它們就是同一個!
恍然大悟的有沒有。既然是同一個對象,那麼任意一個地方修改了 ViewModel 中的 LiveData 中的資料, 我們都可以通過 LiveData 監聽來感覺資料的變化。
這樣,無論是 Activity 和 Fragment 之間,還是 Fragment 和 Fragment 之間,都可以随便操作資料來。
可參考:https://www.jianshu.com/p/5fbde7a2189e 中對 ViewModel 的使用。
這就是目前我感覺最友善優雅的 activity, fragment 和 fragment 通信方式了,如果有更好的,望告知,交流。