我有一个自定义视图,扩展了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()
}
在单向绑定中 witch 运作良好。
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