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