Если вы хотите сделать что-то вроде функции EditText.setError()
с привязкой данных, вот два метода.
Способ 1
Используется окончательное представление EditText, сгенерированное из привязки данных (https://developer.android.com/topic/libraries/data-binding/index.html#views_with_ids)
Вы можете вызвать EditText напрямую, не создавая его вручную, так как он автоматически генерируется после того, как вы установите идентификатор для представления (также верно для включенного макета) .
MainActivityBinding.etext_uname.setError("Wrong email format");
Or
MainActivityBinding.etext_uname.addTextChangedListener(new MyOwnTextWatcher());
Метод 2
Если вы хотите использовать метод привязки с 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 с настраиваемым действием, например показано тост, показано диалоговое окно. Вы должны использовать метод «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;
}
});
Пожалуйста, не стесняйтесь редактировать мой код, чтобы сделать привязку более универсальной для использования разработчиком.
person
Long Ranger
schedule
05.09.2016