如果你想用数据绑定做类似EditText.setError() 的函数,这里有两种方法。
方法一
使用了数据绑定生成的最终 EditText 视图 (https://developer.android.com/topic/libraries/data-binding/index.html#views_with_ids)
您可以直接调用 EditText 而无需手动创建它,因为它是在您为视图设置 id 后自动生成的(对于包含的布局也是如此)。
MainActivityBinding.etext_uname.setError("Wrong email format");
或者
MainActivityBinding.etext_uname.addTextChangedListener(new MyOwnTextWatcher());
方法二
如果你想使用乔治提到的xml绑定方法(https://medium.com/google-developers/android-data-binding-custom-setters-55a25a7aea47#.su88ujqrn)
首先您必须设置自己的绑定方法。建议为所有绑定方法创建另一个类。
方法必须是静态的,带有@BindingAdapter注解和对应的绑定方法名(可以自定义命名空间和方法名)
1.设置自定义 TextWatcher
public class MyOwnBindingUtil {
public interface StringRule {
public boolean validate(Editable s);
}
@BindingAdapter("android:watcher")
public static void bindTextWatcher(EditText pEditText, TextWatcher pTextWatcher) {
pEditText.addTextChangedListener(pTextWatcher);
}
@BindingAdapter(value = {"email:rule", "email:errorMsg"}, requireAll = true)
public static void bindTextChange(final EditText pEditText, final StringRule pStringRule, final String msg) {
pEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (!pStringRule.validate(s)) {
pEditText.setError(msg);
}
}
});
}
/*
Your other custom binding method
*/
}
如果您想使用自定义操作设置您自己的 TextWatcher,例如显示的 Toast、显示的对话框。你应该使用“android:watcher”方法
mBinding.setWatcher(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
在xml中,
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:email="http://schemas.android.com/tools"
>
<data>
<variable
name="watcher"
type="android.text.TextWatcher"/>
<variable
name="emailRule"
type="example.com.testerapplication.MyOwnBindingUtil.StringRule"/>
<variable
name="errorMsg"
type="java.lang.String"/>
</data>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Input Email"
android:watcher="@{watcher}
/>
2。设置您自己的验证规则和错误消息
如果你想使用 setError 函数并且只留下 errorMsg 和验证逻辑来定制。你可以像下面这样设置xml。
在xml中,
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:email="http://schemas.android.com/tools"
>
<data>
<variable
name="watcher"
type="android.text.TextWatcher"/>
<variable
name="emailRule"
type="example.com.testerapplication.MyOwnBindingUtil.StringRule"/>
<variable
name="errorMsg"
type="java.lang.String"/>
</data>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Input Email"
email:rule="@{emailRule}"
email:errorMsg="@{errorMsg}"
/>
活动代码
mBinding.setErrorMsg("Wrong type");
mBinding.setEmailRule(new MyOwnBindingUtil.StringRule() {
@Override
public boolean validate(Editable s) {
// check if the length of string is larger than 18
return s.toString().length() > 18;
}
});
请随时编辑我的代码,使绑定更通用,以供开发人员使用。