0

我对所有这些 MVVM 和 Android 架构组件还是新手。我有几个屏幕(登录和注册),其中包含电子邮件、密码、姓名等的输入,以及仅在正确填写必填字段时启用的“继续”按钮。还有诸如“密码必须是……”和“不是有效的电子邮件……”等消息的文本视图。我正在尝试使用绑定适配器和视图模型将一些验证逻辑从我的 MainActivity 中拉出并远离我的业务逻辑,但我很挣扎。我什至不确定这是否是最好的方法。我对 ViewModel 的想法是,它会在旋转/活动更改时保持其状态。

RegisterActivity 是一个 Activity,它只包含一个带有 3 个片段(电子邮件/密码、名字/姓氏、验证码)的 ViewPager。

绑定适配器

@BindingAdapter("app:onTextChanged")
public static void onTextChanged(TextInputEditText view, TextViewBindingAdapter.OnTextChanged listener) {

}

布局

<TextView
            android:id="@+id/tv_error_message"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:layout_marginTop="16dp"
            android:text="@string/register_email_requirement"
            android:textColor="@color/moenPrimaryError"
            android:textSize="18sp"
            android:visibility="@{viewModel.emailValidationVisible ? View.VISIBLE: View.GONE}"
            app:layout_constraintBottom_toTopOf="@id/input_layout_password"
            app:layout_constraintEnd_toEndOf="@+id/input_layout_email_address"
            app:layout_constraintStart_toStartOf="@+id/input_layout_email_address"
            app:layout_constraintTop_toBottomOf="@+id/input_layout_email_address"
            app:layout_goneMarginTop="16dp" />

<com.google.android.material.textfield.TextInputEditText
                android:id="@+id/input_email_address"
                style="@style/MoenTextInputEditText"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="textEmailAddress"
                app:onTextChanged="@{viewModel.onTextChanged}"
                app:onFocusChange="@{inputLayoutEmailAddress}">

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

视图模型

public class RegisterFragmentViewModel extends BaseObservable {
    private boolean emailValidationVisible = false;

    @Bindable
    public boolean getEmailValidationVisible() {
        return this.emailValidationVisible;
    }

    public void toggle() {
        this.emailValidationVisible = !this.emailValidationVisible;
        notifyPropertyChanged(BR.viewModel);
    }

    public void onTextChanged(CharSequence s, int start, int before, int count) {
        Log.w("tag", "onTextChanged " + s);
        this.toggle();
    }
}

这只是我的一个测试。我的想法是我可以将 TextView 可见性绑定到一个布尔值,我可以使用 onTextChanged 侦听器进行切换/操作,但我不知道如何连接绑定适配器。我在正确的道路上吗?有没有更好/更简单的方法来做到这一点?

4

1 回答 1

0

我在正确的道路上吗?有没有更好/更简单的方法来做到这一点?

这是一种方法。我将从这一行中删除三元运算符

  android:visibility="@{viewModel.emailValidationVisible ? View.VISIBLE: View.GONE}"

并在您的 VM 中创建一个返回它的简单函数。例如:

   @Bindable
   public int getVisibility() {
      return emailValidationVisible ? View.VISIBLE: View.GONE     
   }

在toggle()中,你会有类似的东西

 public void toggle() {
    this.emailValidationVisible = !this.emailValidationVisible;
    notifyPropertyChanged(BR.visibility);
}

这将为您调用吸气剂。您的 xml 将必须更改如下

  android:visibility="@{viewModel.getVisibility()}"

或者,您可以创建一个BindingAdapter采用布尔值并相应地更改可见性的值

于 2019-07-02T12:47:26.300 回答