привязка данных настраиваемого атрибута Kotlin

18

Я пытаюсь установить пользовательский атрибут, используя библиотеку Android DataBinding в моем проекте Kotlin:

Разметка

<ImageView
    android:id="@+id/imgView”
    android:layout_width="40dp"
    android:layout_height="40dp"
    android:layout_gravity="center"
    android:adjustViewBounds="true"
    app:imageUrl="@{segment.url}"/>

Код

  class Utils {
        companion object {
            @BindingAdapter("bind:imageUrl")
            @JvmStatic
            fun loadImage(view: ImageView, url:String) 
            {Picasso.with(view.context).load(url).error(R.drawable.error).into(view)}
    }       

Ошибка выполнения, которую я получаю:

  

A BindingAdapter in in не является статическим и требует использования объекта, извлеченного из DataBindingComponent. Если вы не используете метод инфляции, берущий DataBindingComponent, используйте DataBindingUtil.setDefaultComponent или сделайте все методы BindingAdapter статическими.

Любые указатели для его решения?

Это происходит только для пользовательских атрибутов. Остальные части данных работают нормально

    
задан Akshata 17.10.2016 в 13:53
источник

3 ответа

28

Просто держите функцию на верхнем уровне, не нужен класс или сопутствующий объект

@BindingAdapter("imageUrl")
fun loadImage(view: ImageView, url:String) { ... }
    
ответ дан Stepango 18.10.2016 в 06:40
источник
11

Попробуйте переключить порядок аннотаций. Кажется, проблема:

class Utils {
    companion object {
        @JvmStatic @BindingAdapter("imageUrl")
        fun loadImage(view: ImageView, url:String) { ... } 
    }
} 

Проблема заключается в том, что компилятор databindng использует getCompanion().loadImage иначе * .
Вы можете проверить это в сгенерированном классе com.your.package.databinding.*Binding

* Немного поиграв, я заметил, что это не имеет никакого отношения к порядку аннотаций, но кажется случайным. Кажется, он меняется, когда я нажимаю «rebuild». Это может быть ошибка в kapt или в компиляторе kotlin

    
ответ дан Lovis 17.10.2016 в 16:04
источник
0

Добавление @JvmStatic до @BindingAdapter("imageUrl") исправлено моя проблема.

Для ex:

object BindingAdapters { @BindingAdapter("android:visibility") @JvmStatic fun setVisibility(view: View, visible: Boolean) { view.visibility = if (visible) View.VISIBLE else View.GONE } }     

ответ дан tieorange 04.01.2018 в 19:12
источник