在新的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"
/>
如何在代码中以编程方式设置按钮的色调? 我基本上试图根据一些用户输入实现按钮的条件着色。
答案 0 :(得分:57)
您可以使用
button.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(R.id.blue_100)));
但我建议你使用昨天刚刚发布的支持库drawable着色:
Drawable drawable = ...;
// Wrap the drawable so that future tinting calls work
// on pre-v21 devices. Always use the returned drawable.
drawable = DrawableCompat.wrap(drawable);
// We can now set a tint
DrawableCompat.setTint(drawable, Color.RED);
// ...or a tint list
DrawableCompat.setTintList(drawable, myColorStateList);
// ...and a different tint mode
DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_OVER);
您可以找到更多in this blog post(参见&#34; Drawable着色&#34;
部分)答案 1 :(得分:41)
看起来像视图有自己的色调管理机制,所以最好放在色调列表中:
ViewCompat.setBackgroundTintList(
editText,
ColorStateList.valueOf(errorColor));
答案 2 :(得分:14)
这是在Kotlin中进行的操作:
view.background.setTint(ContextCompat.getColor(context, textColor))
答案 3 :(得分:12)
通过提供真实的代码情况正确扩展dimsuz的答案,请参阅以下代码段:
Drawable buttonDrawable = button.getBackground();
buttonDrawable = DrawableCompat.wrap(buttonDrawable);
//the color is a direct color int and not a color resource
DrawableCompat.setTint(buttonDrawable, Color.RED);
button.setBackground(buttonDrawable);
此解决方案适用于将drawable用作按钮背景的场景。它也适用于前Lollipop设备。
答案 4 :(得分:5)
您可以使用DrawableCompat,例如
public static Drawable setTint(Drawable drawable, int color) {
final Drawable newDrawable = DrawableCompat.wrap(drawable);
DrawableCompat.setTint(newDrawable, color);
return newDrawable;
}
答案 5 :(得分:3)
我有类似的问题。我希望基于颜色(int)值为视图着色复杂的可绘制背景。 我成功地使用了代码:
ColorStateList csl = new ColorStateList(new int[][]{{}}, new int[]{color});
textView.setBackgroundTintList(csl);
其中color是表示所需颜色的int值。 这表示简单的xml ColorStateList:
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:color="color here"/>
</selector>
希望这有帮助。
答案 6 :(得分:3)
如果您使用的是Kotlin
和Material Design
,则可以这样更改MaterialButton
的颜色:
myButton.background.setTintList(ContextCompat.getColorStateList(context, R.color.myColor))
您可以通过为MaterialButton
创建扩展功能来更好地改善它,以使您的代码更具可读性,而编码却不那么方便:
fun MaterialButton.changeColor(color: Int) {
this.background.setTintList(ContextCompat.getColorStateList(context, color))
}
然后,您可以像下面这样在各处使用函数:
myButton.changeColor(R.color.myColor)
答案 7 :(得分:3)
除了 Shayne3000 的答案外,您还可以使用颜色资源(不仅是int颜色)。 科特林版本:
var indicatorViewDrawable = itemHolder.indicatorView.background
indicatorViewDrawable = DrawableCompat.wrap(indicatorViewDrawable)
val color = ResourcesCompat.getColor(context.resources, R.color.AppGreenColor, null) // get your color from resources
DrawableCompat.setTint(indicatorViewDrawable, color)
itemHolder.indicatorView.background = indicatorViewDrawable
答案 8 :(得分:2)
我设法让我的工作方式是使用CompoundButtonCompat.setButtonTintList(button, colour)
。
根据我的理解,无论Android版本如何,这都有效。
答案 9 :(得分:1)
使用setBackgroundTintList
int myColor = Color.BLACK;
button.setBackgroundTintList(new ColorStateList(EMPTY, new int[] { myColor }));
button.setBackgroundTintList(ColorStateList.valueOf(myColor));
button.setBackgroundTintList(contextInstance.getResources().getColorStateList(R.color.my_color));
答案 10 :(得分:1)
在Java中
myButton.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(R.id.white)));
在科特林
myButton.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(R.id.white)))
答案 11 :(得分:0)
这很容易在材质设计库中的新“材质按钮”中进行处理,首先,添加依赖项:
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))
答案 12 :(得分:0)
如果您的基于XML的颜色状态列表引用了主题属性,则此处建议的答案在android 5.0上无法正常工作。 例如,我有一个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>
使用它作为xml的backgroundTint在android 5.0和其他所有版本上都很好。但是,如果我尝试在这样的代码中进行设置:
(请勿执行此操作)
myButton.setSupportButtonTintList(ContextCompat.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
实际上,我是否将Activity或按钮的上下文传递给ContextCompat.getColorStateList()方法都没有关系,但都不会为我提供关于按钮所在主题的正确颜色状态列表。这是因为直到api 23和ContextCompat都不做任何特殊的操作来解决这些问题,才支持在颜色状态列表中使用主题属性。相反,您必须使用 AppCompatResources.getColorStateList(),它在设备 相反,您必须使用此: TLDR:如果需要跨Android所有API版本的已解析主题资源,请使用 AppCompatResources 而不是-ContextCompat-。 有关该主题的更多信息,see this article。myButton.setSupportBackgroundTintList(AppCompatResources.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));
答案 13 :(得分:0)
简单,我们也可以用于图像查看
filename = 'alice.txt'
try:
with open(filename, encoding='utf-8') as f_obj:
contents = f_obj.read()
except FileNotFoundError:
msg = 'Sorry, the file ' + filename + 'does not exist. '
print(msg)
else:
words = contents.split()
words_set = set(words)
wordfreq = []
for w in words_set:
wordfreq.append(words.count(w))
pairs = zip(words_set, wordfreq)
sorted_pairs = sorted(pairs, key=lambda x:x[1], reverse=True)
for w, wq in sorted_pairs:
print("'{}' appears {} times.".format(w, wq))
答案 14 :(得分:0)
checkbox.ButtonTintList = ColorStateList.ValueOf(Android.Color.White);
使用 ButtonTintList
而不是 BackgroundTintList
答案 15 :(得分:-1)
色调可以添加到按钮,如:
filterBtn.setBackgroundTintList(ContextCompat.getColorStateList(context,R.color.colorPrimary))