找不到带参数的属性的设置器
Posted
技术标签:
【中文标题】找不到带参数的属性的设置器【英文标题】:Cannot find the setter for attribute with parameter 【发布时间】:2017-03-04 11:42:47 【问题描述】:我正在使用 DataBinding
和 BindingAdapter
。这是我的自定义方法。
@BindingAdapter("bind:fadevisible")
public static void setFadeVisible(LinearLayout view, int visible)
Log.e("Bindings", "setFadeVisible: ");
在 xml 文件中,我这样称呼它
<LinearLayout
android:layout_
android:layout_
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 ****\数据绑定错误****
我已经检查了 this 和 this 线程,但不知何故它对我没有帮助,正如你所看到的,我从 xml 和 BindingAdapter
传递了 int
,我还提到了 LinearLayout
和 int
价值。
即使我有另一种方法,只是参数不同并且工作正常
@BindingAdapter("bind:image_round")
public static void loadRoundImage(ImageView imageView, String url)
【问题讨论】:
我觉得没问题。 @Raghunandan 是的,但不知何故我的工作不正常,即使是另一种语法几乎相同且工作正常的方法 【参考方案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_
android:layout_
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 版本升级到对我有用的最新版本。
【讨论】:
以上是关于找不到带参数的属性的设置器的主要内容,如果未能解决你的问题,请参考以下文章