首页 > 解决方案 > MVVM TextInputLayout 验证

问题描述

我正在学习 MVVM,我想在 ViewModel 层中验证文本,而不是在 Fragment 中。

数据变量:

<data>
    <variable
        name="viewmodel"
        type="com.pup.ccis.mmReady.viewModel.LoginViewModel"/>
    <variable
        name="validator"
        type="com.pup.ccis.mmReady.utilities.validation.validators.UserValidator.Validators" />
</data>

TextInputLayout 的布局 XML:

<com.google.android.material.textfield.TextInputLayout
        android:id="@+id/fragment_login_til_email"
        style="@style/App_TextInputEditTextStyle"
        android:layout_marginBottom="@dimen/et_space_0">

        <com.google.android.material.textfield.TextInputEditText
            style="@style/App_TextInputEditTextStyle"
            android:inputType="textEmailAddress"
            android:hint="Email Address"
            android:autofillHints="emailAddress"
            android:text="@={viewmodel.loginEmail}"
            android:afterTextChanged="@{() -> viewmodel.validate(viewmodel.loginEmail, validator.REQUIRED_FIELD)}"/>
    </com.google.android.material.textfield.TextInputLayout>

TextInputLayout 元素有一个接受 CharSequence 的方法 setError()。问题是我无法绑定它,因为我无法在布局 XML 中设置它。 我见过这个,但它是不同类型的 TextInputLayout。我已经到处搜索了。

视图模型

public class LoginViewModel extends BaseObservable {
private static final String TAG = "LoginViewModel";

private String loginEmail;
        
@Bindable
public String getLoginEmail() {
    return loginEmail;
}

public void setLoginEmail(String loginEmail) {
    this.loginEmail = loginEmail;
    notifyPropertyChanged(BR.loginEmail);
}

ViewModel 中的验证函数:

public void validate(String text, Validator validator){
    if(!validator.validate(text)){
        validator.getInvalidMsg(); // Pass this to the TextInputLayout in View Layer so that it will become textInputLayout.setError(validator.getInvalidMsg())
    }
}

我知道我可以在 View 层中验证它,但如果我没记错的话,数据验证应该在 MVVM 的 ViewModel 层上进行。

标签: javaandroidvalidationmvvmandroid-textinputlayout

解决方案


推荐阅读