【问题标题】:MVVM data Binding validationMVVM 数据绑定验证
【发布时间】:2020-05-14 18:28:20
【问题描述】:

我想使用 MVVM 和数据绑定验证注册用户数据。这是我的代码,请指导我:

活动

    registerViewModel = new ViewModelProvider(this).get(RegisterViewModel.class);
    binding.setSignUpObject(new RegisterRequest());
    binding.setSignUpClickListener(registerViewModel);

型号

public class RegisterRequest extends BaseObservable {


@SerializedName("Email")
private String userEmail;
@SerializedName("Password")
private String userPassword;
@Expose
private String userConfirmPassword;
@SerializedName("Phone")
private String userPhone;
@SerializedName("ImagePath")
private String imagePath;
@SerializedName("Name")
private String userName;

@Expose
private RegisterErrors registerErrors;
}

// 当然使用带有 nonotifyPropertyChanged 的​​ setter 和带有 @Bindable 注解的 getter // 然后我创建了一个 RegisterErrors 类来在 app:error xml 上使用它来处理错误

RegisterErrors

public class RegisterErrors {

private String userEmailError;
private String userPasswordError;
private String userConfirmPasswordError;
private String userPhoneError;
private String imagePathError;
private String userNameError;

}

XML

   <variable
        name="signUpObject"
        type="com.rabe7.community.model.request.register.RegisterRequest" />

    <variable
        name="signUpClickListener"
        type="com.rabe7.community.view_model.user_management.RegisterViewModel" />

                        <com.google.android.material.textfield.TextInputLayout
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:textColorHint="@color/colorBlackTransparent">

                            <EditText
                                android:id="@+id/et_sign_up_user_name"
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:layout_marginEnd="@dimen/dp16w"
                                android:hint="@string/label_sign_up_user_name"
                                app:error="@{signUpObject.registerErrors.userNameError}"
                                android:inputType="text"
                                android:maxLines="1"
                                android:text="@={signUpObject.userName}"
                                android:textColor="@color/colorBlack" />

                        </com.google.android.material.textfield.TextInputLayout>

问题是..我想在点击提交按钮后验证用户输入..如何在视图模型上通过绑定验证它

我试试这个:

视图模型

    public void onRegisterSubmitClicked(RegisterRequest registerRequest){
    this.registerRequest = registerRequest;

    if(registerRequest.getUserName().length()<6){
        registerRequest.getRegisterErrors().setUserNameError("error");
        }

}

但是app:error 不起作用,我不知道该怎么办..所以请帮助我:)

【问题讨论】:

  • “app:error”是@bindingadapter吗?可以发一下吗?
  • 没有文章说它是内置在 android xml 或数据绑定上的,所以我不知道 .. 你有其他解决方案吗?
  • 好吧,我有两件事要说:我强烈建议您尽可能迁移到视图绑定(更容易)。另一件事:我有一个正在运行数据绑定的项目,但我找不到这个“应用程序:错误”,我认为它是一个自定义数据绑定适配器,例如 github.com/chenriquevz/challenge-alpha/blob/master/app/src/main/…github.com/chenriquevz/challenge-alpha/blob/master/app/src/main/…
  • "我强烈建议您尽可能迁移到视图绑定(更容易)。"看不懂?

标签: java android xml validation binding


【解决方案1】:

您可以在 ViewModel 中这样做:

 /**
     * Two way bind-able fields
     */
    var userName: String = "" 

另外,编写一个在 ViewModel 中验证屏幕的方法

fun validateSignupScreen() {
    if (userName.isEmpty()) {
        return
    } else if (userPassword.isEmpty()) {
        return
    } else {
        // Do your work here 
    }
}

在你的 Activity 类中这样做:

registerViewModel.validateSignupScreen()

【讨论】:

  • 我想使用数据绑定在视图模型中实现所有逻辑,因此 1- 用户输入数据 2- signUpObject 保存数据 3- 用户单击提交 4- 交付给视图模型的对象 5- 验证对象缺少的部分是从视图模型更新 ui
猜你喜欢
  • 1970-01-01
  • 2021-04-27
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 2014-01-29
  • 1970-01-01
相关资源
最近更新 更多