绑定适配器无法正常工作

时间:2017-01-08 13:43:18

标签: android data-binding android-databinding android-binding-adapter

我很难让@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。但是有一些我错过的东西

5 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,我错过了使用以下方法绑定布局:

DataBindingUtil.setContentView(activity, layoutResId);

答案 1 :(得分:1)

请记住将以下行添加到您应用的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}" />

viewModel:

var errorOccurred = androidx.databinding.ObservableBoolean(false)

答案 2 :(得分:0)

我建议对可绑定属性使用“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”

答案 3 :(得分:-1)

尝试使用

@BindingAdapter({"bind:imageUrl"})

答案 4 :(得分:-1)

您正在xml中使用app:imageUrl="@{item.imageUrl}",请确保模型中有一个名为imageUrl的字符串。

您必须传递图像的url链接,而不是bindingAdapter的名称。

语法:

app:BinderAdapterName="@{item.imagelink}"