我可以在ViewModel中使用view.getContext()作为我的Databinding类

时间:2018-05-14 07:49:28

标签: android mvvm onclicklistener android-databinding

我正在使用数据绑定和MVVM结构。

<layout >
  <data>
    <variable
      name="loginVM"
      type="drish.com.dsfaallstars.login.viewmodel.LoginViewModel"/>
  </data>
...
<Button
        android:id="@+id/loginButton"
        android:textStyle="bold"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:background="@drawable/button"
        android:text="@{loginVM.buttonText}"
        android:textColor="@android:color/white"
        android:onClick="@{(view)->loginVM.loginProcess(view,username.getText().toString(),password.getText().toString())}"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/guideline"
        app:layout_constraintStart_toStartOf="@+id/guideline2"
        app:layout_constraintTop_toBottomOf="@+id/textInputLayout3"
        app:layout_constraintVertical_bias="0.19"/>
...
</layout>

在我的ViewModel中,我正在处理onClick,在该方法中,我需要在需要时显示警告框,警报框需要视图的上下文,而不是应用程序上下文。

这样就可以了,或者我应该采用其他更有效和更有帮助的方法。

public void loginProcess(View v, String user, String pass) {
    Log.e(LogConst.TAG, "loginProcess: ");
    Log.e(LogConst.TAG, " username " + user + "======= password " + pass);
    if (user.length() < 1 || pass.length() < 1) {
      new CustomLoginDialog(user, pass, v.getContext());
    } else if (checkCredentialsOffline(user, pass)) {
      Log.e(LogConst.TAG, "loginProcess: Async ");
      new LoginTaskAsync(v, user, pass).execute();
    }
  }

2 个答案:

答案 0 :(得分:2)

使用MVVM的主要目的之一是使您的应用程序可测试。理想情况下,ViewModel应该抽象掉所有特定于Android的依赖项,以便您可以为其业务逻辑编写非检测测试。我创建了一个&#34; Activity&#34;接口后面我放置了大多数特定于上下文的调用(例如&#34; showDialog&#34;),以便我可以在需要时模拟它们。

答案 1 :(得分:1)

简短的回答是“是的”。但是,您可能希望将视图模型拆分为两个不同的类:一个用于数据,另一个用于处理事件。

通常需要具有数据绑定的事件处理程序,我更喜欢将这些事件处理程序放在与数据分开的单独类中。您最终将两个值传递给绑定类而不是一个。如果这让您感到困扰,那么请坚持使用现在的一个视图模型类。