Как избежать явного вызова findDrawableByLayerId и getDrawable в BindingAdapter - PullRequest
0 голосов
/ 15 апреля 2020

В сценарии использования имеется DatabindingAdapter, который соответственно изменяет цвет Drawable элемента viewHolder.

@BindingAdapter("setBackgroundColor")
fun setColor(imageView: ImageView, id: String) {
imageView.background =
    (ContextCompat.getDrawable(
        imageView.context,
        R.drawable.background_corner_right
    ) as LayerDrawable?)?.run {
        imageViewBackground =
            (findDrawableByLayerId(R.id.corneredDrawable) as GradientDrawable)
                .apply {
                    mutate()
                }
        this
    }
imageViewBackground?.setColor(Color.parseColor(id))
}

и в части XML:

     <ImageView
        android:id="@+id/iv_color"
        android:layout_width="50dp"
        android:layout_height="30dp"
        setBackgroundColor="@{contractType.color}"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintHorizontal_bias="0.0"/>

Это работает только хорошо, но я хочу оптимизировать больше, не вызывая явно findDrawableByLayerId , ни R.drawable.background_corner_right

, в любом случае, я могу передать их в Xml и в BindingAdapter в качестве параметров? это сделает BindingAdapter более универсальным c и может использоваться повторно

1 Ответ

0 голосов
/ 15 апреля 2020

Оказывается, что я могу получить доступ к своему DrawableLayer в слое, указанном по его индексу, поэтому (findDrawableByLayerId (R.id.corneredDrawable) как GradientDrawable) заменяется на (findDrawableByLayerId (getId (0) )) как GradientDrawable)

что касается самого фона, я добавил его к XML и назвал его (imageView.background as LayerDrawable)

решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...