API < 23 上带有图像选择器的 MaterialButton

MaterialButton with image selector on API < 23

我正在尝试将 MaterialButton checkabledrawableTopCompat 一起使用,这样当我检查 Button 时,文本和可绘制对象会改变颜色。

我需要它在 API >= 21

上工作

目前我得到的结果:

这是我的 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,但还是不行

您必须以编程方式执行此操作,因为您发现,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()
}

我只使用 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