如何更改按钮上 Compound Drawable 的颜色?

How to change color of CompoundDrawable on Button?

我想弄清楚如何更改按钮左侧可绘制图标的颜色。

下面是我正在使用的 XML 代码:

  <Button
        android:layout_width="wrap_content"
        android:layout_height="20dp"
        android:layout_toRightOf="@+id/student_images"
        android:drawableLeft="@mipmap/ic_email_black_18dp"
        android:text="   myemail@gmail.com  "
        android:layout_below="@+id/email"
        android:background="#00000000"
        android:layout_marginBottom="20dp"
        android:fontFamily="sans-serif"
        android:textColor="@color/gray_text_color"
        />

我试过 android:tint 但是图标的颜色没有改变。我被困在这里。

您可以像下面这样以编程方式设置色调:

int tintColor = ContextCompat.getColor(context, android.R.color.darker_gray);

Button button = (Button) findViewById(R.id.button);

Drawable drawable = ContextCompat.getDrawable(context, R.mipmap.ic_email_black_18dp);
drawable = DrawableCompat.wrap(drawable);
DrawableCompat.setTint(drawable.mutate(), tintColor);

drawable.setBounds( 0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

button.setCompoundDrawables(drawable, null, null, null);

或者您可以使用 snodnipper 的库 Support Drawable Tints
该库可以为 Button 的 drawableLeft 设置色调。
https://github.com/snodnipper/android-appcompat-issue198613

设置图标颜色使用

android:drawableTint="@color/colorPrimary"

您也可以将其用于 XML

app:drawableTint="@android:color/white"

我一直在寻找您在这里提出的问题,最后,我找到了一个 hack 而不是一个解决方案,在这个解决方案中我决定使用我想要的配置和需要时在代码中单独设置它们。

想象一下,我想将可绘制颜色更改为灰色以表明它已被停用。这是正常情况下的可绘制对象: ic_email_black_18dp.xml

<vector 
    android:height="18dp" 
    android:viewportHeight="24.0"
    android:viewportWidth="24.0" 
    android:width="18dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path 
    android:fillColor="#FF000000"  
    android:pathData="M20,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,8l-8,5 -8,-5L4,6l8,5 8,-5v2z"/>
</vector>

您只想更改 fillColor,所以这是新的 XML 文件:ic_email_gray_18dp.xml

<vector 
    android:height="18dp" 
    android:viewportHeight="24.0"
    android:viewportWidth="24.0" 
    android:width="18dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path 
    android:fillColor="#44000000"  
    android:pathData="M20,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,8l-8,5 -8,-5L4,6l8,5 8,-5v2z"/>
</vector>

现在在您的代码中,您可以通过将其完全替换为新颜色来更改可绘制对象的颜色:

        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {

                        //Everything else that this button is supposed to do

                        button.setCompoundDrawablesWithIntrinsicBounds(
                             R.drawable.ic_email_gray_18dp, //left
                             0, //top
                             0, //right
                             0 //bottom
                               );

            }
        });

这个解决方案听起来很有前途,因为复制的文件几乎不需要 space 而且不仅如此,您还可以对图标的不同状态进行更多自定义,而无需执行大量不必要的样板代码(当您需要更改图标中不止一种颜色等)。