无法找到带参数的属性的设置器

29 人关注

我正在研究 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}"/>

But it is showing error

错误:任务':app:compileDebugJavaWithJavac'执行失败。 java.lang.RuntimeException。发现数据绑定错误。 ****/数据绑定错误 ****msg:无法找到android.widget.LinearLayout上参数类型为int的属性'app:fadevisible'的设置器。 file:\app\src\main\res-main\layout\activity_detail.xml loc:236:31 - 236:54 ****\数据绑定错误 ****

我已经检查了thisthis thread but somehow it is not helping me, as you can see i am passing int from xml和in BindingAdapter also i have mentioned LinearLayout with int value.

Even i have another method, where just parameters are different和its working fine

@BindingAdapter({"bind:image_round"}) 
public static void loadRoundImage(ImageView imageView, String url)
    
2 个评论
在我看来是好的。
Ravi
@Raghunandan 是的,但不知为什么我的方法不工作,甚至另一个方法有几乎相同的语法,它工作得很好。
android
data-binding
android-databinding
Ravi
Ravi
发布于 2016-10-22
8 个回答
Kishan Solanki
Kishan Solanki
发布于 2021-06-25
已采纳
0 人赞同

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

我喜欢当美丽的解决方案作为从底部开始的第二个答案出现时。谢谢你,伙计
tynn
tynn
发布于 2021-06-25
0 人赞同

你的 @BindingAdapter 的定义在我看来有点奇怪

@BindingAdapter("{bind:fadevisible}")
@BindingAdapter({"bind:fadevisible"})
@BindingAdapter("bind:fadevisible")

which should work perfectly fine.

Akram
Akram
发布于 2021-06-25
0 人赞同

我在绑定 ImageView 时遇到了这个问题,与你的情况不同,我的绑定适配器的定义是正确的,但IDE仍然一直给我这个错误信息。在花了很多时间寻找原因之后,我想我在 xml 布局文件中使用的命名空间需要和我在 @BindingAdapter 中声明的完全一样。

So, if my xml is like below:

<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}"完全一致。

所以与大多数教程中所说的不同。don't use在你的绑定方法中的@BindingAdapter({"bind:image_url"})和你的xml文件中的app:image_url="@{item.logoUrl}"

Emre Aslan
Emre Aslan
发布于 2021-06-25
0 人赞同

You try

 @BindingAdapter("bind:fadevisible")
    
Ravi
但我有另一种方法 @BindingAdapter({"bind:image_round"}) public static void loadRoundImage(ImageView imageView, String url) ,它可以完美地工作,没有任何错误。
你试试 @BindingAdapter("app:fadevisible")
Ravi
替换代码0】成功了,但你能解释一下为什么 @BindingAdapter({"bind:fadevisible"}) 没有成功吗?
@RaviRupareliya 我试了一下你的代码,没有改动,它对我来说是有效的。事实上,我在相同的布局中对一个按钮也做了同样的尝试,效果不错。
Ravi
@Raghunandan 是的,这就是我所想的,它应该工作,甚至我已经尝试了清洁和重建,无效缓存和重启,但不知道问题在哪里。
edafe
edafe
发布于 2021-06-25
0 人赞同

我最初把我的 customBindidingAdapter 定义为私有。

@BindingAdapter("setPriorityColor")
private static void getPriorityColor(TextView textView, int priority) {
    
Matt Mc
Matt Mc
发布于 2021-06-25
0 人赞同

在我的特殊情况下,我的 BindingAdapter two 参数,有 requireAll ,而我忽略了在我的布局XML中把它们中的一个放在元素上。 所以,像这样:(Kotlin,我知道)

@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,这是完全正确的,没有这样的适配器;只有一个用于twoargs.

一个提示是,Android Studio将MyAdapter染成了灰色,表明它是一个未使用的函数。

显然,一个更有说服力的错误信息,如 "没有app:arg1类型的String的适配器,但有一个用于..."。(当one我希望能有更多的人参与进来,但我不知道该怎么办。

真棒的答案;)
Sachin Mandhare
Sachin Mandhare
发布于 2021-06-25
0 人赞同

追加回答 如果你在多个模块上工作,那么你在哪里有

 @BindingAdapter("fadevisible")

That module should have the following code in the module -> build.gradle.

dataBinding {
    enabled = true