ошибка: <identifier>указать при настройке адаптеров привязки для двусторонней привязки данных - PullRequest
2 голосов
/ 06 апреля 2020

Я пытаюсь установить двухстороннее связывание для 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()
    }

}

Но я получаю :

error: <identifier> expected
            float callbackArg_0 = mBindingComponent.null.getText(inputFieldSize);

Что мне не хватает?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

В XML может отсутствовать один соответствующий id; по крайней мере, там написано null.

И что TextInputEditText ожидает CharSequence вместо Float.

При @BindingAdapter("android:text") он победит ' никогда не вызываться с Float.

Для таких Float получателей / установщиков вам нужно будет расширить TextInputEditText.

0 голосов
/ 19 апреля 2020

Вам не хватает еще одного адаптера привязки, как указано в документации 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)
}

Когда вы создаете @InverseBindingAdapter(attribute = "android:text"), создается событие android:textAttrChanged, и у вас есть добавить для него адаптер привязки.

Вызов textAttrChanged?.onChange() вызовет InverseBindingAdapter, который вы создали.

РЕДАКТИРОВАТЬ: Кроме того, вы используете Kotlin, поэтому вам не нужно помещать адаптеры привязки в object. Отдельного файла будет достаточно. Просто удалите упаковку object DataBindingAdapters {..} и @JvmStatic, и все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...