首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin双向绑定自定义视图

Kotlin双向绑定自定义视图
EN

Stack Overflow用户
提问于 2018-08-28 17:13:44
回答 1查看 2K关注 0票数 6

我有一个扩展ConstraintLayout的自定义视图,包含1个EditText和2个TextViews

在我的自定义视图中,我定义了这个attr (和其他):

代码语言:javascript
复制
<attr name="Text" format="string" />

我用它就像:

代码语言:javascript
复制
app:Text="@={login.email}"

在我的自定义视图中,我定义:

代码语言:javascript
复制
  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()
    }

女巫在单向绑定中工作得很好

代码语言:javascript
复制
app:Text="@{login.email}"

但是当我试图在双向绑定中使用它时,我会得到指向ActivityLoginBinding.java java.lang.String callbackArg_0 =mBindingComponent.null.getText(MEmail)的错误;

怎样才能得到双向绑定?

L.E:经过一些研究之后,我得出了以下结论:

代码语言:javascript
复制
@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

EN

回答 1

Stack Overflow用户

发布于 2020-10-30 21:35:10

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

这对我有效(如果文本为0,将文本设置为空String ):

代码语言:javascript
复制
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()
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52063206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档