Не удается найти GETTER для атрибута app:vm с типом значения Boolean.

Я пытаюсь использовать встроенную двустороннюю привязку данных Android в своем пользовательском элементе управления.

так что у меня есть что-то подобное в xml

<layout>
<data>
<variable name="item" type="Boolean"/>
</data>
...
<my.control app:vm="@={item}"/>
...
</layout>

Обратите внимание, что речь идет о @={} — нативной двусторонней привязке.


и что-то подобное в коде:

class MyControl extends RelativeLayout{
...
@BindingAdapter("app:vm")
public static void setVm(View v, VM vm){...}
}

Мои вопросы - как мне определить геттер для моей модели представления? Я не нахожу никаких указаний по этому поводу. Я пробовал разные подходы - писать собственные геттеры, статические геттеры, но ошибка все та же.


person silent_coder    schedule 27.06.2016    source источник


Ответы (2)


Взято из здесь, в разделе " Роллинг самостоятельно":

Вам понадобится немного больше дополнительного кода, чтобы заставить двустороннюю привязку данных работать с пользовательскими классами. Самое главное, вам нужно определить @InverseBindingMethod:

@InverseBindingMethods({
   @InverseBindingMethod(type = MyControl.class, attribute = "vm"),
})

В этом случае имя геттера совпадает с именем атрибута «getVm» для «app:vm». (изменено на ваш пример)

Пожалуйста, посетите связанный блог — в нем есть дополнительная информация по этой теме, включая привязку прослушивателя событий изменения атрибута.

person yennsarah    schedule 27.06.2016
comment
Спасибо, эта ссылка помогла мне с двухсторонней привязкой для RadioGroup, я обнаружил, что для нее есть готовая привязка: android:checkedButton - person live-love; 03.06.2018

Версия Котлина:

object DataBindingUtil {
    @BindingAdapter("emptyIfZeroText")    //use this instead "android:text"
    @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()
}
person Sam Chen    schedule 30.10.2020