Изменить цвет значка значка MaterialButton программно [Kotlin]

#android #kotlin #android-vectordrawable

#Android #kotlin #android-vectordrawable

Вопрос:

Мне нужно изменить оттенок значка моей MaterialButton, значок является векторным ресурсом xml, и я могу легко изменить оттенок в макете xml, но мне нужно программно изменить цвет одним щелчком мыши, я не могу найти что-то связанное с этой проблемой, это моя кнопка:

 <com.google.android.material.button.MaterialButton
                android:id="@ id/btnShowDepartmentList"
                style="@style/com.madison.Button.IconButton"
                app:iconSize="32dp"
                android:padding="0dp"
                android:paddingLeft="5dp"
                android:paddingStart="5dp"
                app:icon="@drawable/ic_list_thumbnails"
                android:layout_width="42dp"
                android:layout_height="42dp"
                app:iconTint="@color/orangeLighter"
                tools:ignore="RtlSymmetry"/> ```
  

Ответ №1:

Вы захотите использовать методы setIconTint(ColorStateList) или setIconTintResource(Int) MaterialButton. Например:

 val button = findViewById<MaterialButton>(R.id.btnShowDepartmentList)
button.setOnClickListener {
    button.setIconTintResource(R.color.orangeLighter)
}
  

Комментарии:

1. вы не можете установить цвет непосредственно в setIconTint, для этого требуется ColorStateList. вместо этого используйте setIconTintResource

2. Спасибо @sudesh! Я не знаю, была ли более старая версия библиотеки с этим методом или я просто ошибся с самого начала, но я обновлю свой ответ.

Ответ №2:

Вам нужно будет передать ColorStateList в iconTint программно.

 btnShowDepartmentList.iconTint = ContextCompat.getColorStateList(activity, R.color.orangeLighter)
  

Ответ №3:

Это работает для меня:

 btnShowDepartmentThumbnails.setOnClickListener {
        btnShowDepartmentThumbnails.setIconTintResource(R.color.orangeLighter)            
    }
  

Моя ошибка заключалась в попытке установить оттенок значка таким образом:

  btnShowDepartmentThumbnails.setOnClickListener {
            it.setIconTintResource(R.color.orangeLighter)            
        }
  

Комментарии:

1. Причина, по которой это не работает, заключается в том, что тип it в лямбда View! -выражении равен (помните, что onClick() методу интерфейса передается аргумент View v ), а метод, который вы пытаетесь вызвать, является методом MaterialButton . Вы могли бы выполнить приведение, если бы хотели использовать it : (it as MaterialButton).foo()