2017-09-29 105 views
0

我試圖實現MVVM partern。 所以我有一個活動包含一個ViewPager與3片段。每個片段在同一個實體上工作。使用MVVM模式時訪問ViewModel

Activty內部我創建了ViewModel的一個實例。

protected void onCreate(Bundle savedInstanceState) { 
    TaskViewModel.Factory factory = new 
    TaskViewModel.Factory(this.getApplication(), mTaskId); 
    mTaskViewModel = ViewModelProviders.of(this, factory).get(TaskViewModel.class); 
} 

現在什麼是正確的方式與片段分享?

是一個getter/setter是否仍然遵守準則?

感謝

回答

0

如果你想分享你的片段(ViewPager)之間的相同視圖模型您使用,而不是「本」(片段)的活性初始化您的視圖模型。

「of」中的第一個參數定義了將使用哪個LivecycleOwner。由於您選擇了該活動,因此ViewModel將在碎片之間保持不變並保持活動狀態,直到活動被破壞。

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { 
    var viewModel = ViewModelProviders.of(
       activity, //define who's the holder of the ViewModel 
       viewModelFactory) 
    .get(YourVm::class.java) 
    /** ..... **/ 
} 

工廠本身只是用於初始化視圖模型(有數據)(科特林)。

Android示例:

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 
     @Nullable Bundle savedInstanceState) { 
      YourVm viewModel = ViewModelProviders.of(
       getActivity(), //define who's the holder of the ViewModel 
       viewModelFactory) 
    .get(YourVm::class); 
    /** ... **/ 
} 

這意味着,你可以初始化/使用您的視圖模型在你的活動,並使用ViewModelProviders.of()獲得持久視圖模型。