【问题标题】:Android databinding src ImageView in xmlxml中的Android数据绑定src ImageView
【发布时间】:2018-12-12 14:58:48
【问题描述】:

我正在显示包含项目的列表

<include
        layout="@layout/item_tags"
         android:title='@{"text"}'
         android:image='@{"@drawable/ic_write_item.xml"}'/>

此布局包含

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="title"
            type="java.lang.String" />

        <variable
            name="image"
            type="java.lang.String" />
    </data>

...

  <ImageView...
                    android:src="@{image}"/>

                <TextView...
                    android:text="@{title}" />

还创建了myDatabindingAdapter

object DataBindingAdapters {

    @BindingAdapter("android:src")
    @JvmStatic
    fun setImageUri(view: ImageView, imageUri: Uri) {
        view.setImageURI(imageUri)
    }

    @BindingAdapter("android:src")
    @JvmStatic
    fun setImageDrawable(view: ImageView, drawable: Drawable) {
        view.setImageDrawable(drawable)
    }

    @BindingAdapter("android:src")
    @JvmStatic
    fun setImageResource(imageView: ImageView, resource: Int) {
        imageView.setImageResource(resource)
    }
}

并以这种方式在片段中初始化

 val binding: FragmentTagsBinding =  DataBindingUtil.inflate(inflater,R.layout.fragment_tags, container,false)

        return binding.root

当我运行它时,我收到以下错误。

E/BitmapFactory:无法解码流: java.io.FileNotFoundException:@drawable/ic_write_item.xml(没有这样的 文件或目录)W/ImageView:resolveUri 在错误的位图 uri 上失败: @drawable/ic_write_item.xml

是适配器的问题吗?我应该发送资源id 而不是文件名吗?

感谢您的帮助。

【问题讨论】:

  • android:image='@{"@drawable/ic_write_item.xml"}' 不起作用,因为您将其作为字符串传递,但是当您编写“@{@drawable/ic_write_item}”时通过数据绑定解析为 Drawable。
  • 我试过了,我得到以下错误e:[kapt]发生异常:android.databinding.tool.util.LoggedErrorException:发现数据绑定错误。

标签: android android-layout android-databinding


【解决方案1】:

我的问题是将XML 中的变量声明为String 而不是type="android.graphics.drawable.Drawable"

另请参阅@Janosch 回答 @{@drawable/ic_write_item} 而不是 @{"@drawable/ic_write_item.xml"}

【讨论】:

  • 嘿,你能解决这个问题吗?您的解决方案是正确的,但它只解决了一半的问题。我面临同样的问题,但据我所知,问题不在于传递资源,而在于设置资源。如果你删除android:src="@{image}",那么代码将会构建,但是当你把它放回去时它会失败,因为它对我来说失败了。请让我知道你的结果。谢谢!
  • 再次嗨,当我们使用 android:src="@{image}" 时,您的答案有效,但我使用 AppCompatImageView 并在抛出错误时设置 app:srcCompat="@{image}"
  • 我以前没有尝试过使用 AppCompactImageView 但也许这可以帮助你cameronstonerblog.wordpress.com/2017/10/18/…你试过改变你的 bindingAdapter 吗?错误是什么?
【解决方案2】:

Android:src 没有获取字符串值。它需要一个资源 id (int)。此外,您可以查看将数据传递到包含布局https://medium.com/@elia.maracani/android-data-binding-passing-a-variable-to-an-include-d-layout-3567099b58f

【讨论】:

  • 谢谢,我传递字符串的错误。我已经关注了这篇文章,它正在使用其余变量,但不适用于 src 属性。我认为@Janosch 的答案是正确的,但也许是 kotlin 问题?
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多