【问题标题】:Data binding with LiveData<Drawable> nullifies value on BindingAdapter?与 LiveData<Drawable> 的数据绑定会使 BindingAdapter 上的值无效?
【发布时间】:2019-11-04 14:03:11
【问题描述】:

我在使用数据绑定更新 drawableLeftTextView 时遇到问题。

我的实时数据:

val iconLiveData = MutableLiveData<Drawable>()

我的绑定适配器:

@BindingAdapter("drawableLeft")
fun TextView.setDrawableLeft(drawable: Drawable?) {
    Timber.d("Setting drawable from adapter: $drawable")
    setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null)
}

布局中的TextView:

<TextView
    ...removed all other params for simplicity
    drawableLeft="@{viewModel.iconLiveData}"/>

改变drawable的代码:

val drawable = repository.getDrawable(R.drawable.ic_google_fit)
                Timber.d("Setting drawable: $drawable")
                iconLiveData.value = drawable

当我执行值更改时会发生以下情况:

2019-11-04 14:49:51.296 23568-23568 D/LOG: Setting drawable: android.graphics.drawable.VectorDrawable@347943e
2019-11-04 14:49:51.298 23568-23568 D/LOG: Setting drawable from adapter: null

Drawable 进入LiveData,但当它进入BindingAdapter 时,它为空。看起来Drawable 无法通过LiveData 传递,但我找不到任何确认。

原因我不能使用资源来代替 Drawable。

【问题讨论】:

    标签: android android-databinding


    【解决方案1】:

    在我在数据绑定中实现 livedata 的时候,我发现有很多类型问题,这会触发具有 null 值的绑定适配器。

    首先,尝试在没有 livedata 的情况下将可绘制对象注入到数据绑定中。例如:在您的活动/片段中从您的实时数据中获取可绘制值并将其放入您的数据绑定中。查看可绘制对象是否为空。 如果drawable不为null,那么数据绑定库很可能会与bindingadapter中drawableLeft的类型混淆。

    您还可以尝试阅读生成的数据绑定代码,以了解幕后情况以及在数据绑定中使用 livedata 失败的地方。

    数据绑定属性“drawableLeft”的名称可能会导致错误,因为它是框架中使用的数据绑定库之外的字符串。

    我很想听听您的问题,了解您是如何解决这个问题的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多