Data binding Kotlin双向绑定自定义视图
我有一个扩展ConstraintLayout的自定义视图,其中包含1个EditText和2个TextView 在自定义视图中,我定义此属性(以及其他属性): 在自定义视图中,我定义:Data binding Kotlin双向绑定自定义视图,data-binding,binding,kotlin,Data Binding,Binding,Kotlin,我有一个扩展ConstraintLayout的自定义视图,其中包含1个EditText和2个TextView 在自定义视图中,我定义此属性(以及其他属性): 在自定义视图中,我定义: companion object { @JvmStatic @BindingAdapter("Text") fun setText(nMe : View, nText: String) { nMe.nInput.setText(nText) } @InverseB
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.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我想您需要的只是
event=“android:TextAttrChanged”
这对我适用(如果文本为0,则将文本设置为空String
):
您是否尝试使用@InverseBindingMethods(InverseBindingMethod(event=“android:textAttrChanged”)。。。在你的反演方法中
app:Text="@{login.email}"
@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)
}
}
}
}
object DataBindingUtil {
@BindingAdapter("emptyIfZeroText")
@JvmStatic
fun setText(editText: EditText, text: String?) {
if (text == "0" || text == "0.0") editText.setText("") else editText.setText(text)
}
@InverseBindingAdapter(attribute = "emptyIfZeroText", event = "android:textAttrChanged")
@JvmStatic
fun getText(editText: EditText) = editText.text.toString()
}