我正在使用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 **** \数据绑定错误****
我已经检查了this和this帖子,但不知何故它没有帮助我,因为你可以看到我从xml和int
传递BindingAdapter
我也有提到LinearLayout
int
值。
即使我有另一种方法,只是参数不同而且工作正常
@BindingAdapter({"bind:image_round"})
public static void loadRoundImage(ImageView imageView, String url)
答案 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 版本升级到对我有用的最新版本。