У меня есть 1 пользовательское представление, которое расширяет ConstraintLayout и содержит 1 EditText и 2 TextViews
В моем собственном представлении я определяю этот атрибут (и другие):
<attr name="Text" format="string" />
и я использую его как:
app:Text="@={login.email}"
Внутри моего собственного представления я определяю:
companion object {
@JvmStatic @BindingAdapter("Text")
fun setText(nMe : View, nText: String) {
nMe.nInput.setText(nText)
}
@InverseBindingAdapter(attribute = "Text")
fun getText(nMe : View) : String {
return nMe.nInput.text.toString()
}
Ведьма прекрасно работает в одностороннем связывании
app:Text="@{login.email}"
Но когда я пытаюсь использовать его в двухсторонней привязке, я получаю ошибки, указывающие на ActivityLoginBinding.java java.lang.String callbackArg_0 = mBindingComponent.null.getText (mEmail);
Что нужно сделать, чтобы получить двустороннюю привязку?
L.E : После некоторых исследований я получаю следующее:
@InverseBindingMethods(InverseBindingMethod(type =
CustomInput::class,attribute = "bind:Text",event =
"bind:textAttrChanged",method = "bind:getText"))
class CustomEditTextBinder {
companion object {
@JvmStatic
@BindingAdapter(value = ["textAttrChanged"])
fun setListener(editText: CustomInput, listener: InverseBindingListener?) {
if (listener != null) {
editText.nInput.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {
}
override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {
}
override fun afterTextChanged(editable: Editable) {
listener.onChange()
}
})
}
}
@JvmStatic
@InverseBindingAdapter(attribute = "Text")
fun getText(nMe: CustomInput): String {
return nMe.nInput.text.toString()
}
@JvmStatic
@BindingAdapter("Text")
fun setText(editText: CustomInput, text: String?) {
text?.let {
if (it != editText.nInput.text.toString()) {
editText.nInput.setText(it)
}
}
}
}
}
Но сейчас я получаю:
Не удалось найти событие TextAttrChanged