Android 传递多个参数的绑定适配器导致错误
Android binding adapter passing multiple arguments cause error
我是 Android Data Binding
的新手。我正在学习本教程:Data Binding Library。
我正在尝试做一个接收多个参数的适配器。这是我的代码:
XML
<ImageView
android:layout_width="@dimen/place_holder_size"
android:layout_height="@dimen/place_holder_size"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_centerVertical="true"
app:url="@{image.imageUrl}"
app:size="@{@dimen/place_holder_size}"
/>
绑定适配器CLASS
public class ViewBindingAdapters extends BaseObservable {
@BindingAdapter({"bind:url", "bind:size"})
public static void loadImage(ImageView imageView, String url, int size) {
if (!Strings.isNullOrEmpty(url)) {
Picasso.with(imageView.getContext()).load(url).resize(size, size).centerCrop().into(imageView);
}
}
....
}
但是我收到这个错误:
java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:Cannot find the setter for attribute 'app:url' with parameter type java.lang.String on android.widget.ImageView.
file:... li_image_item.xml
loc:30:27 - 30:40
****\ data binding error ****
有人知道为什么吗?
提前致谢!
试试这个
@BindingAdapter(value={"url", "size"}, requireAll=false)
public static void loadImage(ImageView imageView, String url, int size) {
if (!Strings.isNullOrEmpty(url)) {
Picasso.with(imageView.getContext()).load(url).resize(size, size).centerCrop().into(imageView);
}
}
问题是 @dimen/place_holder_size
,它是 returns float
而你正在捕捉它 int
把你的BindingAdapter
方法改成这个
@BindingAdapter({"bind:url", "bind:size"})
public static void loadImage(ImageView imageView, String url, float size) {
}
可以参考this
更新
您不需要创建前缀 bind:
,只需使用它即可。
@BindingAdapter({"url", "size"})
public static void loadImage(ImageView imageView, String url, float size) {
}
在 xml 中使用任何前缀,例如 app:
app:url="@{image.imageUrl}"
我做错的是函数中参数的顺序。您可以在绑定适配器中添加多个属性,但它们应该与方法中定义的相同序列的参数相匹配。
这是我的 Kotlin 代码片段
@BindingAdapter(value = ["bind:brand", "bind:model", "bind:age"], requireAll = false)
@JvmStatic
fun bindProductDetails(linearLayout: LinearLayout, brand: String?, model: String?, age: String?) {
if (brand != null && !brand.isEmpty()) {
//code
//code
}
}
除了@Kishan Solanki 上面提供的示例之外,随着数据绑定库中发生的变化,您只需要用逗号分隔值声明它们。例子
@BindingAdapter("loadImageFrom", "widthDp")
fun loadImages(imageView: ImageView, url: String?, widthDp: Int) {
url?.let {
val height = (widthDp / 3) * 4
val fullUrl = getImagePosterUrl(url)
Picasso.get().load(fullUrl).resize(widthDp.px, height.px).into(imageView)
}
}
但最重要的是要记住,您以 DataBinding 格式向适配器属性提供数据。
在 XML 中提供 Int 作为参数的示例,您必须编写
app:widthDp="@{120}"
这是
app:your_attribute="@{your_data}"
P. S. - 哦,还有一件事,widthDp**.px** 是一个扩展函数,它根据屏幕密度将 dp 值的 Int
转换为相关像素值。所以不要混淆。
参见https://developer.android.com/topic/libraries/data-binding/binding-adapters。
@BindingAdapter("imageUrl", "placeholder", requireAll = false)
fun ImageView.setImageUrl(url: String?, placeHolder: Drawable?) {
if (url == null) {
setImageDrawable(placeholder)
} else {
MyImageLoader.loadInto(this, url, placeholder)
}
}
请注意,BindingAdapter
属性和 setImageUrl
参数可能有不同的名称。但他们应该按照相同的顺序进行。如果其中一些属性定义在XML中(在这个例子中是ImageView
),这个方法将被调用。
<ImageView
app:imageUrl="@{venue.imageUrl}"
app:placeholder="@{@drawable/venueError}" />
属性的类型应与方法中定义的类型相同。您也可以使用 . Instead of Kotlin lambdas use interfaces.
这个class应该和XML放在同一个模块中。否则你会得到类似 AAPT: error: attribute imageUrl (aka com.example.imageUrl) not found.
.
的错误
我是 Android Data Binding
的新手。我正在学习本教程:Data Binding Library。
我正在尝试做一个接收多个参数的适配器。这是我的代码:
XML
<ImageView
android:layout_width="@dimen/place_holder_size"
android:layout_height="@dimen/place_holder_size"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_centerVertical="true"
app:url="@{image.imageUrl}"
app:size="@{@dimen/place_holder_size}"
/>
绑定适配器CLASS
public class ViewBindingAdapters extends BaseObservable {
@BindingAdapter({"bind:url", "bind:size"})
public static void loadImage(ImageView imageView, String url, int size) {
if (!Strings.isNullOrEmpty(url)) {
Picasso.with(imageView.getContext()).load(url).resize(size, size).centerCrop().into(imageView);
}
}
....
}
但是我收到这个错误:
java.lang.RuntimeException: Found data binding errors. ****/ data binding error ****msg:Cannot find the setter for attribute 'app:url' with parameter type java.lang.String on android.widget.ImageView. file:... li_image_item.xml loc:30:27 - 30:40 ****\ data binding error ****
有人知道为什么吗?
提前致谢!
试试这个
@BindingAdapter(value={"url", "size"}, requireAll=false)
public static void loadImage(ImageView imageView, String url, int size) {
if (!Strings.isNullOrEmpty(url)) {
Picasso.with(imageView.getContext()).load(url).resize(size, size).centerCrop().into(imageView);
}
}
问题是 @dimen/place_holder_size
,它是 returns float
而你正在捕捉它 int
把你的BindingAdapter
方法改成这个
@BindingAdapter({"bind:url", "bind:size"})
public static void loadImage(ImageView imageView, String url, float size) {
}
可以参考this
更新
您不需要创建前缀 bind:
,只需使用它即可。
@BindingAdapter({"url", "size"})
public static void loadImage(ImageView imageView, String url, float size) {
}
在 xml 中使用任何前缀,例如 app:
app:url="@{image.imageUrl}"
我做错的是函数中参数的顺序。您可以在绑定适配器中添加多个属性,但它们应该与方法中定义的相同序列的参数相匹配。
这是我的 Kotlin 代码片段
@BindingAdapter(value = ["bind:brand", "bind:model", "bind:age"], requireAll = false)
@JvmStatic
fun bindProductDetails(linearLayout: LinearLayout, brand: String?, model: String?, age: String?) {
if (brand != null && !brand.isEmpty()) {
//code
//code
}
}
除了@Kishan Solanki 上面提供的示例之外,随着数据绑定库中发生的变化,您只需要用逗号分隔值声明它们。例子
@BindingAdapter("loadImageFrom", "widthDp")
fun loadImages(imageView: ImageView, url: String?, widthDp: Int) {
url?.let {
val height = (widthDp / 3) * 4
val fullUrl = getImagePosterUrl(url)
Picasso.get().load(fullUrl).resize(widthDp.px, height.px).into(imageView)
}
}
但最重要的是要记住,您以 DataBinding 格式向适配器属性提供数据。
在 XML 中提供 Int 作为参数的示例,您必须编写
app:widthDp="@{120}"
这是
app:your_attribute="@{your_data}"
P. S. - 哦,还有一件事,widthDp**.px** 是一个扩展函数,它根据屏幕密度将 dp 值的 Int
转换为相关像素值。所以不要混淆。
参见https://developer.android.com/topic/libraries/data-binding/binding-adapters。
@BindingAdapter("imageUrl", "placeholder", requireAll = false)
fun ImageView.setImageUrl(url: String?, placeHolder: Drawable?) {
if (url == null) {
setImageDrawable(placeholder)
} else {
MyImageLoader.loadInto(this, url, placeholder)
}
}
请注意,BindingAdapter
属性和 setImageUrl
参数可能有不同的名称。但他们应该按照相同的顺序进行。如果其中一些属性定义在XML中(在这个例子中是ImageView
),这个方法将被调用。
<ImageView
app:imageUrl="@{venue.imageUrl}"
app:placeholder="@{@drawable/venueError}" />
属性的类型应与方法中定义的类型相同。您也可以使用
这个class应该和XML放在同一个模块中。否则你会得到类似 AAPT: error: attribute imageUrl (aka com.example.imageUrl) not found.
.