文本观察程序绑定适配器与视图模型



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

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

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

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

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

相关内容

  • 没有找到相关文章