在新的AppCompat库中,我们可以这样为按钮着色:
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/follow"
android:id="@+id/button_follow"
android:backgroundTint="@color/blue_100"
/>
如何在我的代码中以编程方式设置按钮的色调?
我基本上是试图实现基于一些用户输入的按钮的条件着色。
如果你不想关心不同版本的android,你可以使用这段代码,基本上任何视图。为我工作。
val states = arrayOf(intArrayOf(android.R.attr.state_enabled))
val colors = intArrayOf(Color.GREEN) // your color here
val colorStateList = ColorStateList(states, colors)
ViewCompat.setBackgroundTintList(yourButtonHere,colorStateList)
Kotlin版本,祝阅读这篇文章的每个人都有美好的一天;)
顺便说一句。如果你创建了一些可绘制的背景形状,这应该只覆盖色调颜色。
如果你不想关心不同版本的android,你可以使用这段代码,基本上任何视图。为我工作。
val states = arrayOf(intArrayOf(android.R.attr.state_enabled))
val colors = intArrayOf(Color.GREEN) // your color here
val colorStateList = ColorStateList(states, colors)
ViewCompat.setBackgroundTintList(yourButtonHere,colorStateList)
Kotlin版本,祝阅读这篇文章的每个人都有美好的一天;)
顺便说一句。如果你创建了一些可绘制的背景形状,这应该只覆盖色调颜色。
这很容易在材质设计库的新材质按钮中处理,首先,添加依赖项:
implementation 'com.google.android.material:material:1.1.0-alpha07'
然后在你的XML中,使用这个按钮:
<com.google.android.material.button.MaterialButton
android:id="@+id/accept"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/i_accept"
android:textSize="18sp"
app:backgroundTint="@color/grayBackground_500" />
当你想改变颜色时,这是Kotlin中的代码,它没有被弃用,可以在Android 21之前使用:
accept.backgroundTintList = ColorStateList.valueOf(ResourcesCompat.getColor(resources,
R.color.colorPrimary, theme))
建议的答案在这里不能正常工作在android 5.0,如果你的XML基于颜色状态列表引用主题属性。
例如,我有一个这样的xml颜色状态列表:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?colorPrimary" android:state_enabled="true"/>
<item android:alpha="0.12" android:color="?attr/colorOnSurface"/>
</selector>
使用这个作为我的backgroundTint from xml在android 5.0和其他任何东西上都很好。然而,如果我试图在代码中这样设置:
(不要这样做)
myButton.setSupportButtonTintList(ContextCompat.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
It actually doesn't matter if I pass the Activity or the button's context to ContextCompat.getColorStateList() method, neither will give me the proper color state list with respect to the theme the button is within. This is because using theme attributes in color state lists wasn't supported until api 23 and ContextCompat does not do anything special to resolve these. Instead you must use AppCompatResources.getColorStateList() which does its own resource parsing/theme attribute resolution on devices < API 23.
相反,你必须这样做:
myButton.setSupportBackgroundTintList(AppCompatResources.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
TLDR:使用AppCompatResources,而不是- contextcompat -如果你需要在android的所有API版本中解析主题资源。
有关该主题的更多信息,请参阅本文。