MaterialButton с селектором изображений на API <23 - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь использовать MaterialButton checkable с drawableTopCompat, чтобы при проверке этого Button текст и его цвет менялись.

Мне нужно, чтобы он работал с API> = 21

результат, который я получил до сих пор:

enter image description here

Вот мой xml:

<com.google.android.material.button.MaterialButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:drawableTop="@drawable/ic_favorite_black_18dp"
    style="@style/Widget.MaterialComponents.TextButton.Checkboxed"
    android:text="Test"/>

<com.google.android.material.button.MaterialButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:drawableTop="@drawable/ic_favorite_black_18dp"
    style="@style/Widget.MaterialComponents.TextButton.Checkboxed"
    android:text="Test"/>

Селектор

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:state_selected="true"
    android:textColor="@color/colorPrimary"
    android:tint="@color/colorPrimary"
    />

</selector>

Я пробовал drawableTint но даже это не т рабочий

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Мне удалось заставить его работать, используя только XML с:

 <com.google.android.material.button.MaterialButton
    android:id="@+id/btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:drawableTop="@drawable/ic_favorite"
    android:textColor="@drawable/selector_checkable"
    app:drawableTint="@drawable/selector_checkable"
    style="@style/Widget.MaterialComponents.TextButton.Checkboxed"
    android:text="TEST"/>

android:drawableTint - это API> 23, но не app:drawableTint

0 голосов
/ 06 мая 2020

Вам придется делать это программно, потому что, как вы узнали, drawableTint доступен только для API 23 и выше. Если вы используете Kotlin, вы можете сделать эту функцию расширения:

fun MaterialButton.updateCompoundDrawablesColor() {
    val color = this.textColors.getColorForState(this.drawableState, 0)
    for (drawable in this.compoundDrawables) {
        drawable?.colorFilter = BlendModeColorFilterCompat
                .createBlendModeColorFilterCompat(color, BlendModeCompat.SRC_IN)
    }
}

Это обновляет цветовой фильтр для каждого составного рисунка, используя тот же список состояний цвета, что и текст. Вы можете использовать это так:

val btn: MaterialButton = view.findViewById(R.id.btn)
btn.updateCompoundDrawablesColor()
btn.addOnCheckedChangeListener { _, _ ->
    btn.updateCompoundDrawablesColor()
}
...