找不到带参数的属性的setter

时间:2016-10-22 06:06:04

标签: android data-binding android-databinding

我正在使用DataBinding处理BindingAdapter。这是我的自定义方法。

@BindingAdapter("{bind:fadevisible}")
public static void setFadeVisible(LinearLayout view, int visible) {
    Log.e("Bindings", "setFadeVisible: ");
}

在xml文件中,我称之为

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:fadevisible="@{1}"/>

但它显示错误

  

错误:任务':app:compileDebugJavaWithJavac'的执行失败。    java.lang.RuntimeException:发现数据绑定错误。   **** /数据绑定错误****消息:在android.widget.LinearLayout上找不到参数类型为int的属性'app:fadevisible'的setter。   文件:\程序\ SRC \主\ RES-主\布局\ activity_detail.xml   当前:236:31-236:54   **** \数据绑定错误****

我已经检查了thisthis帖子,但不知何故它没有帮助我,因为你可以看到我从xml和int传递BindingAdapter我也有提到LinearLayout int值。

即使我有另一种方法,只是参数不同而且工作正常

@BindingAdapter({"bind:image_round"}) 
public static void loadRoundImage(ImageView imageView, String url)

8 个答案:

答案 0 :(得分:8)

你的@BindingAdapter定义对我来说有点奇怪

@BindingAdapter("{bind:fadevisible}")

这与

不一样
@BindingAdapter({"bind:fadevisible"})

@BindingAdapter("bind:fadevisible")

应该可以完美地运作。

答案 1 :(得分:4)

你试试

 @BindingAdapter("bind:fadevisible")

答案 2 :(得分:4)

确保在应用程序级别gradle中,您拥有apply plugin: 'kotlin-kapt'

答案 3 :(得分:2)

我在绑定到ImageView时遇到了这个问题,并且与您的情况不同,我的绑定适配器的定义是正确的,但是IDE仍然向我显示此错误消息。在花费大量时间寻找原因之后,我发现在xml布局文件中使用的命名空间必须与在@BindingAdapter中声明的名称空间完全相同。

因此,如果我的xml如下所示:

<ImageView
    android:id="@+id/logo"
    android:layout_width="32dp"
    android:layout_height="32dp"
    android:layout_alignParentRight="true"
    android:layout_marginRight="16dp"
    android:layout_marginTop="16dp"
    app:image_url="@{item.logoUrl}"
/>

然后我的绑定方法应该如下:

@BindingAdapter({"app:image_url"})
public static void loadImage(ImageView view, String logoUrl) {
    if (logoUrl == null) {
        view.setImageResource(R.drawable.ic_place_holder);
    } else {
        Glide.with(getContext()).load(logoUrl).crossFade().into(view);
    }
}

请注意,绑定方法注释指示其中的名称空间,即@BindingAdapter({"app:image_url"}),与布局文件app:image_url="@{item.logoUrl}"中使用的名称空间完全相同

与大多数教程中所说的不同,请勿在绑定方法中使用 @BindingAdapter({"bind:image_url"}),在app:image_url="@{item.logoUrl}"文件中不要使用xml

答案 4 :(得分:0)

我最初将customBindidingAdapter定义为私有:

@BindingAdapter("setPriorityColor")
private static void getPriorityColor(TextView textView, int priority) {
}

答案 5 :(得分:0)

如果您正在使用多个模块,那么请加上答案

 @BindingAdapter("fadevisible")

该模块在模块中应具有以下代码-> build.gradle。

dataBinding {
    enabled = true
}

享受快乐的编码。 :)

答案 6 :(得分:0)

在我的特定情况下,我的BindingAdapter有两个参数,带有requireAll,而我忽略了将其中一个参数放在布局XML的元素中。所以,像这样:(科特琳,我知道)

@BindingAdapter("app:arg1", "app:arg2", requireAll = true)
fun MyAdapter(view: ImageView, x: String, y: Int) {
    // ...
}
<Element app:arg1="@{"foo"}"/>

错误大致为Cannot find the setter for attribute "app:arg1" with parameter String,这是完全正确的,没有这样的适配器; 两个参数中只有一个。

一个暗示发生这种情况的情况是,Android Studio通过将其涂成灰色表示MyAdapter是未使用的功能。

显然,更有说服力的错误消息,例如“对于类型app:arg1的{​​{1}}没有适配器,但是有一个适配器……”(当属性 one 时)名称匹配),但我不会屏住呼吸。

答案 7 :(得分:0)

除了@BindingAdapter 的改进 (我的在一个版本中工作正常,而在另一个版本中没有), 将 Build gradle 版本升级到对我有用的最新版本。