Привязка данных с LiveData <Drawable>обнуляет значение в BindingAdapter? - PullRequest
0 голосов
/ 04 ноября 2019

У меня проблема с обновлением drawableLeft из TextView с использованием привязки данных.

Мои живые данные:

val iconLiveData = MutableLiveData<Drawable>()

MyАдаптер переплета:

@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}"/>

Код, который можно изменить для рисования:

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, этозначение NULL. Похоже, Drawable нельзя передать через LiveData, но я не могу найти подтверждения этому.

По причинам Я не могу использовать ресурс вместо Drawable.

1 Ответ

0 голосов
/ 04 ноября 2019

В то время, когда я реализовал liveata в привязке данных, я обнаружил, что было много проблем с типами, которые приводили бы к тому, что адаптер привязки приводил к нулевому значению.

Во-первых, попробуйте внедрить отрисовываемый объект в свой файл. привязка данных без проживания. Например: в вашей деятельности / фрагменте получите значение drawable из ваших liveata и поместите его в привязку данных. Посмотрите, является ли drawable нулевым или нет. Если drawable не является нулевым, то есть большая вероятность, что библиотека привязки данных перепутается с типом drawableLeft в bindingadapter.

Вы также можете попробовать прочитать сгенерированный код привязки данных, чтобы понять, что происходит под капотом. и где не удается использовать liveata в привязке данных.

Имя свойства привязки данных "drawableLeft" может вызвать ошибки, так как это строка, используемая в каркасе из библиотеки привязки данных.

I 'Я хотел бы услышать ответ на ваш вопрос, чтобы узнать, как вы прошли через это.

...