AppCompatButton 23.2.1 app:backgroundTint 不会为 Android 5.0 (API 21) 上的按钮着色,但在 ≤ API 19 和 ≥ API 22 上可以完美运行

AppCompatButton 23.2.1 app:backgroundTint doesn't color the button on Android 5.0 (API 21) but works perfectly on ≤ API 19 and ≥ API 22

这是一个非常令人困惑的问题,因为有太多可用的信息,而且我们有太多版本的 appcompat 支持库,它们似乎反复出现问题并得到修复。

即使在 appcompat 支持库 23.2.1 上,AppCompatButton 属性 app:backgroundTint 也无法在 Android 5.0 上正常工作。它在 Android 4.4 及更低版本和 Android 5.1 及更高版本上完美运行。只有 Android 5.0 有问题。

那么如何使用在 Android 5.0 上正确运行的 AppCompat 支持库来制作有色按钮?

(我会回答我自己的问题。)

这是一个 known issue of 23.2.1 并标记为 'FutureRelease' 即,已为下一版本修复。

编辑:在 23.3.0 中仍未修复。

编辑:最终在 23.4.0 中修复。

此答案假定使用 appcompat-v7 支持库 23.2.1。

参考 ,确实无法在 Android 5.0 中对按钮进行原生着色。 (在 Android 5.1 中,他们 修复了 它以便它成为可能。)

即使不使用 appcompat 库,<Button android:backgroundTint="..."/> 也不起作用。该按钮保持灰色。

查看 appcompat 版本 23.2.1 的源代码,似乎兼容性着色仅适用于 Android 4.4 及以下版本。在 Android 5.0 及更高版本上,它使用原生着色。不幸的是,这是错误的方法。在 Android 5.0 上,还应应用兼容性着色。

您可以通过在代码中的按钮上调用 setSupportBackgroundTintList 来强制进行兼容性着色,着色将在 Android 5.0 上正确发生。

一种可能的解决方案是按如下方式对 AppCompatButton 进行子类化:

public class AppCompatButton2 extends AppCompatButton {
    public AppCompatButton2(final Context context, final AttributeSet attrs) {
        super(context, attrs);
        if (android.os.Build.VERSION.SDK_INT >= 21) {
            final ColorStateList csl = getBackgroundTintList();
            setSupportBackgroundTintList(csl);
        }
    }
}