具有ViewModel

时间:2019-07-02 12:40:29

标签: android mvvm viewmodel android-mvvm android-binding-adapter

我对所有MVVM和Android体系结构组件还是陌生的。我有几个屏幕(登录和注册),分别输入电子邮件,密码,名称等,还有一个“继续”按钮,只有在正确填写必填字段时才启用。还有用于消息的文本视图,例如“密码必须为...”和“无效的电子邮件...”。我正在尝试使用绑定适配器和视图模型将某些验证逻辑从MainActivity中拉出,并脱离业务逻辑,但是我很挣扎。我什至不确定这是否是最好的方法。我对ViewModel的想法是,它将在旋转/活动更改时保持其状态。

RegisterActivity是一个Activity,仅包含一个ViewPager,其中包含3个片段(电子邮件/密码,名字/姓氏,验证码)。

绑定适配器

@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>

ViewModel

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侦听器切换/操作的布尔值,但是我不知道如何连接绑定适配器。我在正确的道路上吗?有没有更好/更简便的方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

  

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

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

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

,然后在您的VM中创建一个简单函数并将其返回。 EG:

   @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并相应地更改其可见性