Адаптер привязки не работает должным образом

Мне трудно заставить @BindingAdapter работать в моем проекте.

@BindingAdapter("imageUrl")
public static void setImageUrl(ImageView imageView, String url) {
    Log.d("TEST","URL: " + url);
}

Вышеприведенный код показывает, как он реализован в моей ViewModel. Ничего особенного.

    <ImageView
        android:id="@+id/image_holder"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scaleType="centerCrop"
        android:layout_below="@id/profile_container"
        app:imageUrl="@{item.imageUrl}"
        tools:src="@drawable/placeholder_image"/>

Это не работает. приложение пространства имен не привязано. Итак, что мне не хватает. Я пытался следовать https://medium.com/google-developers/android-data-binding-custom-setters-55a25a7aea47#.6ygaiwooh и посмотрите, как они устанавливают bindingAdapter. Но есть что-то, что я пропустил


person Jemil Riahi    schedule 08.01.2017    source источник
comment
Вы добавили пространство имен в свой тег макета вместе с xmlns:android? Если нет, вы также должны добавить xmlns:app="http://schemas.android.com/apk/res-auto".   -  person George Mount    schedule 10.01.2017


Ответы (4)


Я столкнулся с той же проблемой, я пропустил привязку макета, используя:

DataBindingUtil.setContentView(activity, layoutResId);
person Swapnil    schedule 28.01.2017
comment
tnx man, я использую это и работаю для меня DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.invite_dialog, null, false); - person emad pirayesh; 27.08.2019

Я предлагаю использовать пространство имен "bind" для связываемых атрибутов и использовать те же имена для параметра адаптера и атрибута макета.

Адаптер:

@BindingAdapter("bind:imageUrl")
public static void setImageUrl(ImageView imageView, String imageUrl) {
     Log.d("TEST","URL: " + imageUrl);
}

Макет:

<ImageView
    android:id="@+id/image_holder"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scaleType="centerCrop"
    android:layout_below="@id/profile_container"

    bind:imageUrl="@{item.imageUrl}"

    tools:src="@drawable/placeholder_image"/>

где пространство имен "app" было заменено на "bind". В корне вашего макета:

 xmlns:bind="http://schemas.android.com/apk/res-auto"
person XIII-th    schedule 09.01.2017

Не забудьте добавить следующую строку в файл build.gradle вашего приложения:

apply plugin: 'kotlin-kapt'

и проверьте синтаксис @BindingAdapter:

@BindingAdapter("visibleOnScreen")
fun View.setVisibility(isVisible: ObservableBoolean) {
    if (isVisible.get())
        this.visibility = View.VISIBLE
    else
        this.visibility = View.GONE
}

в представлении xml:

<TextView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   app:visibleOnScreen="@{viewModel.errorOccurred}" />

видМодель:

var errorOccurred = androidx.databinding.ObservableBoolean(false)
person kosiara - Bartosz Kosarzycki    schedule 18.11.2019

Вы используете app:imageUrl="@{item.imageUrl}" в xml, убедитесь, что в вашей модели есть строка с именем imageUrl.

Вы должны передать URL-ссылку изображения, а не имя связующего адаптера.

Синтаксис:

app:BinderAdapterName="@{item.imagelink}"
person Abdo Driowya    schedule 17.11.2018