AppCompatButton 23.2.1应用程序:backgroundTint没有为Android 5.0(API 21)上的按钮着色,但在API 19和≥API22上完美运行

时间:2016-03-18 03:55:39

标签: android widget android-appcompat appcompat-v7-r23.2

这是一个非常令人困惑的问题,因为有太多可用信息,而且我们有很多版本的appcompat支持库似乎会破坏并重复修复。

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

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

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

2 个答案:

答案 0 :(得分:1)

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

编辑:仍未在23.3.0中修复。

编辑:最后修复于23.4.0。

答案 1 :(得分:0)

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

参考Lollipop's backgroundTint has no effect on a Button,确实无法在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);
        }
    }
}