3

我有一個視圖模型命名SharedViewModel:共享視圖模型

public class SharedViewModel<T> extends ViewModel { 

    private final MutableLiveData<T> selected = new MutableLiveData<>(); 


    public void select(T item) { 
     selected.setValue(item); 
    } 

    public LiveData<T> getSelected() { 
     return selected; 
    } 
} 

我實現它基礎上,谷歌的拱門視圖模型參考頁面上SharedViewModel例如:

https://developer.android.com/topic/libraries/architecture/viewmodel.html#sharing_data_between_fragments

一個活動中的兩個或多個片段需要相互通信是很常見的。這從來不是微不足道的,因爲 片段需要定義一些接口描述,並且所有者活動必須將兩者綁定在一起。此外,這兩個片段必須處理其他片段尚未創建或不可見 的情況。

我有兩個片段,分別叫ListFragmentDetailFragment

到現在爲止,我使用了這兩個片段在MasterActivity。一切運作良好。

我得到了ListFragment中的ViewModel,選擇了在DetailFragment上使用它的值。

mStepSelectorViewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class); 

然而,現在我需要在某些情況下該ListFragment(佈局到不同的設備配置)被添加到一個不同的活動,稱爲DetailActivity。有沒有辦法做到這一點類似上面的例子?

+3

你正在打架。如果它轉到另一個名爲DetailActivity的活動,那麼爲您的Detail Activity創建一個ViewModel。 ViewModels不僅僅是「可以超越配置更改的魔法對象」。他們是你的觀點和你的模型之間的膠水。如果你有不同的活動,你的觀點現在有所不同,因此它需要一個新的視圖模型。如果你像谷歌期望的那樣將問題分開,那麼有權訪問數據的「存儲庫」可以/將被這些視圖模型共享,但它們是不同的實體。 –

+3

如果你正在傳遞一個新的Activity,你不應該爲你的對象使用'Parcelable'嗎? –

+0

實現一個接口來監聽你的活動中選擇了哪個列表項目,包括ListFragment。然後在ListFragment中,獲取onAttach事件中的接口。使用findFragmentByTag將所選項目傳遞給MasterActivity中的DetailFragment,並將其傳遞到其他活動的DetailActivity中。 – sunghun

回答

0

你可以使用工廠,使視圖模型而這個因素將返回視圖模型的單一對象。由於:

class ViewModelFactory() : ViewModelProvider.Factory { 

override fun create(modelClass: Class): T { 
    if (modelClass.isAssignableFrom(UserProfileViewModel::class.java)) { 
    val key = "UserProfileViewModel" 
    if(hashMapViewModel.containsKey(key)){ 
     return getViewModel(key) as T 
    } else { 
     addViewModel(key, UserProfileViewModel()) 
     return getViewModel(key) as T 
    } 
    } 
    throw IllegalArgumentException("Unknown ViewModel class") 
} 

companion object { 
    val hashMapViewModel = HashMap<String, ViewModel>() 
    fun addViewModel(key: String, viewModel: ViewModel){ 
     hashMapViewModel.put(key, viewModel) 
    } 
    fun getViewModel(key: String): ViewModel? { 
     return hashMapViewModel[key] 
    } 
} 
} 

在活動時間:

viewModelFactory = Injection.provideViewModelFactory(this) 

// Initialize Product View Model 
userViewModel = ViewModelProviders.of(this, viewModelFactory).get(
UserProfileViewModel::class.java)` 

這將提供UserProfileViewModel只有單個對象您可以在活動之間分享。

+0

這條線「Injection.provideViewModelFactory(this)」怎麼辦,怎麼做這行得通? – Konrad

+0

注入是自定義類,它負責提供ViewModelFactory的實例。這裏是類: 對象注射{ 樂趣provideViewModelFactory(背景:上下文):ViewModelFactory { 回報ViewModelFactory() }} –

相關問題