2016-11-07 10 views
8

MVVMとDataBindingを使用してAndroidアプリを構築しています。私はViewModel内でアクティビティを開始する関数を持っています。 ViewModel内でonClick呼び出しを行うことはできますか?Android MVVMのベストプラクティスstartActivity

このようにします。

public class MyViewModel { 
    public void onClick(View view, long productId) { 
     Context context = view.getContext(); 
     Intent intent = new Intent(context, ProductDetailActivity.class); 
     intent.putExtra("productId", productId); 
     context.startActivity(intent); 
    } 
} 

そして、私のXMLで:

... 
android:onClick="@{(v) -> viewModel.onClick(v, viewModel.product.id)}"> 

それともビューに移動し、EventBusまたはRXからそれを呼び出すためのベストプラクティスも、私のViewModelにのみPOJOを持っているでしょうか?

答えて

7

あなたの質問への答えはあなたの目標は何ですか?

問題の分離にMVVMを使用して、ViewModelを単体テストできるようにするには、ViewModelとは別のコンテキストを必要とするすべてのものを保持してください。 Viewmodelには、アプリケーションの中核となるビジネスロジックが含まれており、外部の依存関係がなくてはなりません。

しかし、私はどこに行くのが好きです:どのアクティビティが開いているかの判断がビューにある場合、JUnitテストを書くのは非常に難しいです。しかし、startActivity()呼び出しを実行するオブジェクトをviewmodelに渡すことができます。今すぐユニットテストでこのオブジェクトを模擬し、正しいアクティビティが開かれていることを確認することができます

+0

"Viewmodelにはアプリケーションのコアビジネスロジックが含まれているため、外部依存関係がなくてはなりません。 - 私はそれは常に外部の依存関係があると思う。私はデータバインディングなしでViewModelを使用する際にポイントが表示されません。それはAndroid固有のものです。例を確認してください。import: "import android.databinding.ObservableBoolean;" – LLL

関連する問題