绑定适配器无法正常工作

16

我在项目中很难让 @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。但是我错过了某些东西


1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - George Mount
"失效并重启"可以工作。 - oguzhan
7个回答

9

我遇到了同样的问题,我忘记使用绑定布局:

DataBindingUtil.setContentView(activity, layoutResId);

1
谢谢,我也使用这个方法,对我也有效。DataBindingUtil.inflate( LayoutInflater.from(context), R.layout.invite_dialog, null, false); - emad pirayesh
@Swapnil:你能否回答类似的问题:https://dev59.com/LG4NtIcB2Jgan1znd_yI - SVK

6
我建议在可绑定属性中使用"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"

请您提供详细的文档说明,为什么这会有任何区别? - Mishka
1
@Mishka 这个建议仅为了提高可读性。使用 bind 命名空间,您可以轻松识别绑定适配器的属性。 - Sergei Bubenshchikov

5

请记得将以下行添加到您的应用程序的 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)

1

我曾经遇到过同样的问题,但其他解决方案都没有效果。后来我找到了这个方法。

在活动中:

dataBinding.lifecycleOwner = this

0

我刚刚在 build.gradle(:app) 的 android 块中,在 compileOptions 和 kotlinOptions 后面放置了 buildFeatures 块。它起作用了。

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
    jvmTarget = '1.8'
}
buildFeatures {
 databinding true
}

0
将以下行添加到您的应用程序的 build.Gradle 文件中:
apply plugin: 'kotlin-kapt'

并在应用程序的build.Gradle文件中的android块中启用数据绑定:

android {
.
.
buildFeatures {
    dataBinding true
}
.
.
}

创建 BindingAdapters.kt 文件并添加以下语法的 @BindingAdapter:
@BindingAdapter("imageUrl")
  fun ImageView.bindImage(imgUrl: String){
  Glide.with(context)
  .load(imgUrl)
  .into(this)
  }

在视图的XML中,在ImageView中使用imageUrl='@{"YourImageUrl"}'语法:

 <ImageView
 android:id="@+id/imageView3"
 android:layout_width="100dp"
 android:layout_height="100dp"
 android:background="@drawable/img"
 imageUrl='@{"YourImageUrl"}'/>

这个很好用 ;)

我的项目 Gradle 版本:7.0.0


-2

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

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

语法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接