我对所有这些 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 侦听器进行切换/操作,但我不知道如何连接绑定适配器。我在正确的道路上吗?有没有更好/更简单的方法来做到这一点?