我正在使用数据绑定和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();
}
}
答案 0 :(得分:2)
使用MVVM的主要目的之一是使您的应用程序可测试。理想情况下,ViewModel应该抽象掉所有特定于Android的依赖项,以便您可以为其业务逻辑编写非检测测试。我创建了一个&#34; Activity&#34;接口后面我放置了大多数特定于上下文的调用(例如&#34; showDialog&#34;),以便我可以在需要时模拟它们。
答案 1 :(得分:1)
简短的回答是“是的”。但是,您可能希望将视图模型拆分为两个不同的类:一个用于数据,另一个用于处理事件。
通常需要具有数据绑定的事件处理程序,我更喜欢将这些事件处理程序放在与数据分开的单独类中。您最终将两个值传递给绑定类而不是一个。如果这让您感到困扰,那么请坚持使用现在的一个视图模型类。