为双向数据绑定设置绑定适配器时出现错误:<identifier>expecte

Ale*_*hel 5 android android-databinding

TextInputEditText我正在尝试为变量设置两种方式绑定Float

这是我的 DataBindingAdapters 类的全部内容。

object DataBindingAdapters  {
    @BindingAdapter("android:text")
    @JvmStatic
    fun setText(view: TextInputEditText, value: Float) {
        if(value != view.text.toString().toFloat()) {
            view.setText(value.toString())
        }
    }


    @InverseBindingAdapter(attribute = "android:text")
    fun getText(view: TextInputEditText): Float  {

        return view.text.toString().toFloat()
    }

}
Run Code Online (Sandbox Code Playgroud)

但我得到:

error: <identifier> expected
            float callbackArg_0 = mBindingComponent.null.getText(inputFieldSize);
Run Code Online (Sandbox Code Playgroud)

我缺少什么?

Moh*_*hru 3

您又错过了一个绑定适配器,如InverseBindingAdapter 文档中所述:

@BindingAdapter(value = [ "android:textAttrChanged"], requireAll = false)
fun setTextWatcher( view: TextInputEditText, textAttrChanged: InverseBindingListener?) {
    val newValue =  object: TextWatcher {
        override fun afterTextChanged(s: Editable?) = Unit

        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) = Unit

        override fun onTextChanged( s:CharSequence,  start:Int,  before:Int,  count:Int) {
                textAttrChanged?.onChange()
        }
    }

    val  oldValue = ListenerUtil.trackListener(view, newValue, R.id.textWatcher)
    if (oldValue != null) {
        view.removeTextChangedListener(oldValue)
    }
    view.addTextChangedListener(newValue)
}
Run Code Online (Sandbox Code Playgroud)

当您创建时@InverseBindingAdapter(attribute = "android:text"),会创建一个事件android:textAttrChanged,并且您必须为其添加绑定适配器。

调用textAttrChanged?.onChange()将触发InverseBindingAdapter您创建的。


编辑:
此外,您正在使用 Kotlin,因此您不需要将绑定适配器放入object. 一个单独的文件就足够了。只要去掉包装纸object DataBindingAdapters {..}@JvmStatic可以了。