Android Fragment 共用 ViewModel

Evan Chen
Evan Android Note
Published in
5 min readJun 13, 2020

MVVM 系列:

🔹DataBinding

🔹ViewModel 與 LiveData

🔹範例 TextInputLayout 顯示錯誤、SnackBar及ProgressBar

🔹Android MVVM:RecyclerView

👉 Fragment 共用 ViewModel

一般來說,Fragment與Activity,會有各自使用的ViewModel。有時候兩個Fragment之間會有著Master與Detail的關係。這時我們就可以考慮讓這兩個Fragment來共用相同的ViewModel,讓ViewModel是依附在Activity的生命週期。

build.gradle 加上dependency

首先建立ViewModel

1.建立一個listLiveData,這是用來讓MainFragment的RecyclerView用的資料

2.新增屬性selected,用來記錄被點選的Item。在DetailFragment就取selected來使用。

MainFragment

在MainViewModel 後面加上 by activityViewModels(),表示這個ViewModel是依附在Activity的生命週期。

在Fragment也可以用DataBinding,在onCreateView 設定。

觀察ViewModel的openItemEvent,用來開啟DetailFragment。

在DetailFragment的viewModel 也使用 by ActivityViewModels(),這樣就可以讓兩個Fragment共用ViewModel。

在detail_fragment.xml 就直接使用viewModel.selected的itemName來顯示就可以了。

從DetailFragment返回MasterFragment

如果要從DetailFragment返回時傳資料回MasterFragment,以往我們都會建立一個Interface,透過Callback來返回資料。

像這樣的情境,也能透過共用ViewModel來處理。例如我要從DetailFragment返回一個字串,就可以在ViewModel建立一個detailString來儲存。

當然不是所有的Fragment都要共用ViewModel,像這個例子是明顯的Master、Detail的感覺才這樣處理。如果兩個Fragment沒有太大的關聯就還是各自用ViewModel。

程式碼下載:https://github.com/evanchen76/FragmentViewModelSample

參考:

https://developer.android.com/training/basics/fragments/communicating
https://developer.android.com/topic/libraries/architecture/viewmodel

歡迎加入我的Facebook:Evan App Note

--

--