Kotlin 2路绑定自定义视图

Posted

技术标签:

【中文标题】Kotlin 2路绑定自定义视图【英文标题】:Kotlin 2-way binding custom view 【发布时间】:2019-02-03 09:39:18 【问题描述】:

我有 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()
    

witch 在单向绑定中工作正常

app:Text="@login.email"

但是当我尝试在 2 路绑定中使用它时,我得到指向 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

【问题讨论】:

您是否尝试在您的 InverseBindingMethod 中使用 @InverseBindingMethods(InverseBindingMethod(event = "android:textAttrChanged"))... 【参考方案1】:

我想你只需要event = "android:textAttrChanged"

这对我有用(将文本设置为空 String 如果它是 0):

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()

【讨论】:

以上是关于Kotlin 2路绑定自定义视图的主要内容,如果未能解决你的问题,请参考以下文章

在 Kotlin 中单击按钮后每秒刷新自定义视图

Kotlin入门(24)如何自定义视图

RxSwift 不将数据绑定到自定义集合视图单元格

将自定义视图绑定到点

android数据绑定与自定义视图

自定义视图上的数据绑定“无法在空引用对象上引用 .setTag”