Ответ 1
Просто держите функцию на верхнем уровне, не нужен класс или сопутствующий объект
@BindingAdapter("imageUrl")
fun loadImage(view: ImageView, url:String) { ... }
Я пытаюсь установить настраиваемый атрибут, используя Android DataBinding Library в моем проекте 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 статическими.
Любые указатели для его решения?
Это происходит только для пользовательских атрибутов. Остальные части данных работают нормально
Просто держите функцию на верхнем уровне, не нужен класс или сопутствующий объект
@BindingAdapter("imageUrl")
fun loadImage(view: ImageView, url:String) { ... }
Попробуйте переключить порядок аннотаций. Кажется, проблема:
class Utils {
companion object {
@JvmStatic @BindingAdapter("imageUrl")
fun loadImage(view: ImageView, url:String) { ... }
}
}
Проблема заключается в том, что компилятор databindng использует getCompanion().loadImage
иначе *.
Вы можете проверить это в сгенерированном классе com.your.package.databinding.*Binding
* Немного поиграв, я заметил, что это не имеет никакого отношения к порядку аннотаций, но кажется случайным. Кажется, он меняется, когда я нажимаю "rebuild". Это может быть ошибка в kapt
или в компиляторе kotlin
Добавление @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
}
}