Android Fragment 共用 ViewModel
MVVM 系列:
🔹範例 TextInputLayout 顯示錯誤、SnackBar及ProgressBar
👉 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
線上課程:
Android自動化測試組合課程
Android 動畫入門到進階
Android UI 進階實戰(Material Design Component)