【问题标题】:Cannot find the setter for attribute with parameter找不到带参数的属性的设置器
【发布时间】:2017-03-04 11:42:47
【问题描述】:

我正在使用 DataBindingBindingAdapter。这是我的自定义方法。

@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:发现数据绑定错误。 ****/ 数据绑定错误 ****msg:在 android.widget.LinearLayout 上找不到参数类型为 int 的属性“app:fadevisible”的设置器。 文件:\app\src\main\res-main\layout\activity_detail.xml 地点:236:31 - 236:54 ****\数据绑定错误****

我已经检查了 thisthis 线程,但不知何故它对我没有帮助,正如你所看到的,我从 xml 和 BindingAdapter 传递了 int,我还提到了 LinearLayoutint价值。

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

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

【问题讨论】:

  • 我觉得没问题。
  • @Raghunandan 是的,但不知何故我的工作不正常,即使是另一种语法几乎相同且工作正常的方法

标签: android data-binding android-databinding


【解决方案1】:

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

【讨论】:

  • 我喜欢美丽的解决方案作为倒数第二个答案出现。谢谢老哥
【解决方案2】:

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

@BindingAdapter("{bind:fadevisible}")

这不一样

@BindingAdapter({"bind:fadevisible"})

@BindingAdapter("bind:fadevisible")

应该可以正常工作。

【讨论】:

    【解决方案3】:

    我在绑定到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"}),在xml 文件中使用app:image_url="@{item.logoUrl}"

    【讨论】:

      【解决方案4】:

      你试试

       @BindingAdapter("bind:fadevisible")
      

      【讨论】:

      • 但我有另一种方法@BindingAdapter({"bind:image_round"}) public static void loadRoundImage(ImageView imageView, String url) ,它运行良好,没有任何错误。
      • 你试试@BindingAdapter("app:fadevisible")
      • @BindingAdapter("bind:fadevisible") 有效,但您能解释一下为什么@BindingAdapter({"bind:fadevisible"}) 无效吗??
      • @RaviRupareliya 我尝试了您的代码没有任何更改,它对我有用。事实上,我为相同布局中的按钮尝试了相同的操作。工作正常。
      • @Raghunandan 是的,这就是我的想法,它应该可以工作,即使我尝试过清理和重建,使缓存无效并重新启动,但不知道是什么问题。
      【解决方案5】:

      我最初将我的customBindidingAdapter 定义为私有:

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

      【讨论】:

        【解决方案6】:

        在我的特定情况下,我的 BindingAdapter两个 参数,带有 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,完全正确,没有这样的适配器; 两个参数只有一个。

        发生这种情况的一个提示是,Android Studio 通过将MyAdapter 涂成灰色来表明它是一个未使用的函数。

        显然,一个更有说服力的错误消息,例如“没有String 类型的app:arg1 适配器,但有一个用于...”(当一个 属性名称匹配时)会很感激,但我不会屏住呼吸。

        【讨论】:

        • 很棒的答案 ;)
        【解决方案7】:

        如果您正在处理多个模块,那么添加到答案中

         @BindingAdapter("fadevisible")
        

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

        dataBinding {
            enabled = true
        }
        

        享受快乐的编码。 :)

        【讨论】:

          【解决方案8】:

          除了@BindingAdapter 的改进 (我的在一个版本中运行良好,而在另一个版本中则不行), 将 Build gradle 版本升级到对我有用的最新版本。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-31
            • 1970-01-01
            • 2016-03-05
            • 2017-03-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多