Адаптер привязки для ресурса измерения в 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, но это тоже не работает. Возможность использовать значение android:layout_width в dp было бы еще лучше, так как мне нужно получить размер, указанный для ImageView, чтобы изменить размер загруженного изображения из pictureUrl.

0
0
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Поскольку тип android:specificWidth — это ресурс, вам нужно установить его, как показано ниже:

android:specificWidth = "@{R.dimen.normal_475}"

также вам нужно импортировать R в свой тег данных:

<import type = "your.package.name.R" />

Или, если вы хотите передать значение измерения, вам нужно изменить ввод bindingAdapterspecificWidth на это:

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}".

Другие вопросы по теме