Android 5上的AppCompatButton:app:backgroundTint起作用,但supportBackgroundTintList不起作用:(

Android 5上的AppCompatButton:app:backgroundTint起作用,但supportBackgroundTintList不起作用:(,android,button,android-appcompat,Android,Button,Android Appcompat,我需要重用XML布局并以编程方式更改按钮颜色。 在Android 5中,在XML中应用app:backgroundTint会更改按钮的颜色,但我需要以编程方式执行,并且我在Recyclerview中执行: holder.button.supportBackgroundTintList = ContextCompat.getColorStateList(context, backgroundColorRes) 这没有任何效果。使用@RestrictTo({Scope.LIBRARY\u GROU

我需要重用XML布局并以编程方式更改按钮颜色。 在Android 5中,在XML中应用
app:backgroundTint
会更改按钮的颜色,但我需要以编程方式执行,并且我在Recyclerview中执行

holder.button.supportBackgroundTintList = ContextCompat.getColorStateList(context, backgroundColorRes)

这没有任何效果。

使用
@RestrictTo({Scope.LIBRARY\u GROUP})
注释
setSupportBackgroundTintList()
方法,这意味着您不应该直接调用它。相反,您应该使用
ViewCompat.setBackgroundTintList()

请尝试将您的代码改为:

val colorStateList = ContextCompat.getColorStateList(context, backgroundColorRes)
ViewCompat.setBackgroundTintList(holder.button, colorStateList)

如果查看
ViewCompat.setBackgroundTintList()
的源代码,您会发现它对API 21+(Android 5及更高版本)的功能与早期版本有所不同背景色调只适用于Android的早期版本,而
ViewCompat
将使您不必考虑这一点。

谢谢!我们是否需要将
ViewCompat
与其他setter一起使用?我如何知道何时需要使用它以及何时可以省去它?简单的答案是始终使用非appcompat视图类型(例如,使用
而不是
)然后在系统警告您试图调用仅在某些版本上受支持的方法时使用
ViewCompat
。在这种情况下,如果您有
按钮
并尝试调用
setbackgroundtinlist()
,您将收到警告:“调用需要API级别21(当前最小值为19)”。这是一个信号,我应该改为使用
ViewCompat.setBackgroundTintList()
。请注意,当您在布局中使用
标记时,如果您的活动使用的是AppCompat主题,则它将自动膨胀为
AppCompat按钮
。因此,您将获得“正确”选项不用想就可以打字。