java - 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 层上进行。
解决方案
推荐阅读
- java - 使用 Cloudera 5.14 和 Spark2 配置 Livy:Livy 找不到自己的 JAR 文件
- java - 将函数添加到另一个包中包含的类
- java - 来自 Angular5 的 PUT 请求到 spring-boot
- php - 如何在面向对象的php中在Restapi中发送json响应
- c# - 是否要向数据网格添加列和行?
- javascript - 小时为“12”时的javascript时间格式问题
- if-statement - VB 脚本 If then End 语句
- php-7 - 使用带有 FILTER_FLAG_ALLOW_FRACTION 的 Filter_SANITIZE_FLOAT 但仍然丢失逗号?
- node.js - 纱线添加嵌套本地包
- mysql - 如何从 API 控制器中提取 MySQL?