【问题标题】:AppCompatButton on Android 5: app:backgroundTint works but supportBackgroundTintList does NOT :(Android 5 上的 AppCompatButton:app:backgroundTint 有效,但 supportBackgroundTintList 无效:(
【发布时间】:2019-01-04 15:50:09
【问题描述】:

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

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

这没有效果。

【问题讨论】:

    标签: android button android-appcompat


    【解决方案1】:

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

    尝试将您的代码改为:

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

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

    【讨论】:

    • 谢谢!我们是否需要将ViewCompat 与其他设置器一起使用?我怎么知道什么时候需要使用它,什么时候可以不使用它?
    • 简短的回答是始终使用非 appcompat 视图类型(例如,使用 <Button> 而不是 <AppCompatButton>),然后在系统警告您正在尝试的任何时候使用 ViewCompat调用仅在某些版本上受支持的方法。在这种情况下,如果您有 Button 并尝试调用 setBackgroundTintList(),您将收到警告:“调用需要 API 级别 21(当前最小值为 19)”。这是一个信号,我应该改用ViewCompat.setBackgroundTintList()
    • 请注意,当您在布局中使用 <Button> 标签时,如果您的活动使用 AppCompat 主题,它将自动膨胀为 AppCompatButton。因此,您无需考虑即可获得“正确”的类型。
    猜你喜欢
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    相关资源
    最近更新 更多