Android 中维度资源的绑定适配器
Binding adapter for dimension resource in Android
我有一个 ImageView,我想为其编写自定义绑定适配器
<ImageView
android:id="@+id/item_list_picture"
android:layout_height="@dimen/normal_475"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:layout_above="@id/item_list_secondary_text"
android:contentDescription="@{listItemViewModel.primaryText}"
android:padding="@dimen/normal_100"
android:displayImageUrl="@{listItemViewModel.pictureUrl}"
android:placeHolderDrawable="@{@drawable/ic_baseline_image_24}"
android:layout_width="@dimen/normal_475"
android:specificWidth="@dimen/normal_475"
android:goneUnless="@{listItemViewModel.pictureUrl != null}" />
specificWidth
的尺寸在 dimens.xml
中定义为
<dimen name="normal_475">77dp</dimen>
最后 BindingAdapter.kt
文件包含以下代码:
@BindingAdapter("android:displayImageUrl", "android:placeHolderDrawable", "android:specificWidth")
fun loadImage(view: ImageView, displayImageUrl: String?, placeHolderDrawable: Drawable, @DimenRes width: Int) {
if (!displayImageUrl.isNullOrEmpty()) {
Picasso.get().load(displayImageUrl).placeholder(placeHolderDrawable)
.resize(view.context.resources.getDimensionPixelSize(width), view.context.resources.getDimensionPixelSize(width)).centerCrop().into(view)
} else {
view.setImageDrawable(placeHolderDrawable)
}
}
如果我使用绑定适配器的 loadImage
而没有 specificWidth
一切正常。否则,我会得到以下错误
ERROR:C:\dev\projects\myapp\app\src\main\res\layout\item_list.xml:69: AAPT: error: attribute android:specificWidth not found.
这里有什么问题?如何从定义的尺寸中获取特定宽度?我还尝试将 android:layout_width
添加到绑定适配器而不是我的自定义 android:specificWidth
,但它也不起作用。在 dp 中使用 android:layout_width
值的可能性会更好,因为我需要获得 ImageView
的大小以调整从 pictureUrl
.
下载的图像的大小
因为android:specificWidth
的类型是资源你需要像下面这样设置:
android:specificWidth="@{R.dimen.normal_475}"
您还需要在数据标签中导入 R
:
<import type="your.package.name.R" />
或者如果您想传递 dimen 值,您需要将 bindingAdapter
specificWidth
输入更改为:
fun loadImage(
view: ImageView,
displayImageUrl: String?,
placeHolderDrawable: Drawable,
width: Float // change the type to float and clear the `@dimenRes` annotation
同时将您的 xml 更改为:
android:specificWidth="@{@dimen/normal_475}" // you need to pass the value in data-binding format
顺便说一下,您也可以像您所说的那样忽略此 android:specificWidth
属性,而是从视图的宽度和高度中读取值。您只需要在 view.post{}
上执行此操作以确保呈现视图并且其大小有效。所以你的 bindingAdapter
乐趣会是这样的:
@BindingAdapter("android:displayImageUrl", "android:placeHolderDrawable")
fun loadImage(view: ImageView, displayImageUrl: String?, placeHolderDrawable: Drawable) {
view.post {
if (!displayImageUrl.isNullOrEmpty()) {
Picasso.get().load(displayImageUrl).placeholder(placeHolderDrawable)
.resize(
view.width,
view.height
).centerCrop().into(view)
} else {
view.setImageDrawable(placeHolderDrawable)
}
}
}
如果您有任何问题或者我没有很好地解决您的问题,请随时提问。
对我有用的解决方案是将特定宽度定义为 android:specificWidth="@{@dimen/normal_475}"
。
我有一个 ImageView,我想为其编写自定义绑定适配器
<ImageView
android:id="@+id/item_list_picture"
android:layout_height="@dimen/normal_475"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:layout_above="@id/item_list_secondary_text"
android:contentDescription="@{listItemViewModel.primaryText}"
android:padding="@dimen/normal_100"
android:displayImageUrl="@{listItemViewModel.pictureUrl}"
android:placeHolderDrawable="@{@drawable/ic_baseline_image_24}"
android:layout_width="@dimen/normal_475"
android:specificWidth="@dimen/normal_475"
android:goneUnless="@{listItemViewModel.pictureUrl != null}" />
specificWidth
的尺寸在 dimens.xml
中定义为
<dimen name="normal_475">77dp</dimen>
最后 BindingAdapter.kt
文件包含以下代码:
@BindingAdapter("android:displayImageUrl", "android:placeHolderDrawable", "android:specificWidth")
fun loadImage(view: ImageView, displayImageUrl: String?, placeHolderDrawable: Drawable, @DimenRes width: Int) {
if (!displayImageUrl.isNullOrEmpty()) {
Picasso.get().load(displayImageUrl).placeholder(placeHolderDrawable)
.resize(view.context.resources.getDimensionPixelSize(width), view.context.resources.getDimensionPixelSize(width)).centerCrop().into(view)
} else {
view.setImageDrawable(placeHolderDrawable)
}
}
如果我使用绑定适配器的 loadImage
而没有 specificWidth
一切正常。否则,我会得到以下错误
ERROR:C:\dev\projects\myapp\app\src\main\res\layout\item_list.xml:69: AAPT: error: attribute android:specificWidth not found.
这里有什么问题?如何从定义的尺寸中获取特定宽度?我还尝试将 android:layout_width
添加到绑定适配器而不是我的自定义 android:specificWidth
,但它也不起作用。在 dp 中使用 android:layout_width
值的可能性会更好,因为我需要获得 ImageView
的大小以调整从 pictureUrl
.
因为android:specificWidth
的类型是资源你需要像下面这样设置:
android:specificWidth="@{R.dimen.normal_475}"
您还需要在数据标签中导入 R
:
<import type="your.package.name.R" />
或者如果您想传递 dimen 值,您需要将 bindingAdapter
specificWidth
输入更改为:
fun loadImage(
view: ImageView,
displayImageUrl: String?,
placeHolderDrawable: Drawable,
width: Float // change the type to float and clear the `@dimenRes` annotation
同时将您的 xml 更改为:
android:specificWidth="@{@dimen/normal_475}" // you need to pass the value in data-binding format
顺便说一下,您也可以像您所说的那样忽略此 android:specificWidth
属性,而是从视图的宽度和高度中读取值。您只需要在 view.post{}
上执行此操作以确保呈现视图并且其大小有效。所以你的 bindingAdapter
乐趣会是这样的:
@BindingAdapter("android:displayImageUrl", "android:placeHolderDrawable")
fun loadImage(view: ImageView, displayImageUrl: String?, placeHolderDrawable: Drawable) {
view.post {
if (!displayImageUrl.isNullOrEmpty()) {
Picasso.get().load(displayImageUrl).placeholder(placeHolderDrawable)
.resize(
view.width,
view.height
).centerCrop().into(view)
} else {
view.setImageDrawable(placeHolderDrawable)
}
}
}
如果您有任何问题或者我没有很好地解决您的问题,请随时提问。
对我有用的解决方案是将特定宽度定义为 android:specificWidth="@{@dimen/normal_475}"
。