如何以编程方式添加按钮色调

时间:2015-04-22 14:40:15

标签: android android-appcompat

在新的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"
    />

如何在代码中以编程方式设置按钮的色调? 我基本上试图根据一些用户输入实现按钮的条件着色。

16 个答案:

答案 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)

如果您使用的是KotlinMaterial 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;
  1. button.setBackgroundTintList(new ColorStateList(EMPTY, new int[] { myColor }));
  2. button.setBackgroundTintList(ColorStateList.valueOf(myColor));
  3. 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(),它在设备

相反,您必须使用此:

myButton.setSupportBackgroundTintList(AppCompatResources.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));

TLDR:如果需要跨Android所有API版本的已解析主题资源,请使用 AppCompatResources 而不是-ContextCompat-。

有关该主题的更多信息,see this article

答案 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))