setColorFilter更改按钮颜色无效

时间:2016-02-16 20:54:55

标签: android button

我的应用布局中有几个按钮,我想动态更改这些按钮的颜色。当我使用

b.setBackgroundColor(0xFF386F00);

颜色按预期更改,但按钮的形状,大小和填充也会发生变化,例如this相关问题。

我尝试使用该答案中建议的解决方案,但正在执行

b.getBackground().setColorFilter(0xFFFF0000,PorterDuff.Mode.MULTIPLY);

对我的任何按钮都没有影响。我不知道这是什么原因。相关代码是:

import android.widget.Button;

...

@Override
public View getView(int i, View convertView, ViewGroup parent) {
    LayoutInflater inflater =
            (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View rowView = inflater.inflate(R.layout.hrlistitems, parent, false);

    Button b = (Button) rowView.findViewById(R.id.HRlistB);
    b.setOnClickListener(onBButtonClicked);
    b.getBackground().setColorFilter(0xFFFF0000,PorterDuff.Mode.MULTIPLY);
    rowView.setTag(values.get(i).getId());

    TextView textView = (TextView) rowView.findViewById(R.id.HRlisttext);
    textView.setText(values.get(i).toTitle());

    return rowView;

}

这是自定义适配器的一部分,这可能会使问题复杂化,但我也尝试了我在"普通"按钮也是如此,没有积极的结果。此外,适配器中的其他所有内容都完全符合我的预期。

这是相应xml文件的按钮部分

<Button
    android:id="@+id/HRlistB"
    android:layout_width="30dp"
    android:layout_height="40dp"
    android:layout_above="@+id/HRlist4"
    android:layout_toLeftOf="@+id/HRlistB2"
    android:layout_toStartOf="@+id/HRlistB3"/>

此按钮由于某种原因呈现为一个小方块(!),周围有一些空间,并且角落是圆形的。我不知道为什么会这样,但我对它的外观很满意。如果设置背景颜色,则大小更改为实际30dpx40dp,没有任何填充,也没有圆角。我试图找到一种方法来改变颜色,并保持原样。

为什么ColorFilter不起作用?

如何在不改变此按钮的任何其他内容(如大小等)的情况下为我的按钮着色作为副作用?

1 个答案:

答案 0 :(得分:2)

您尚未将已过滤的drawable设置为按钮的背景:

@Override
public View getView(int i, View convertView, ViewGroup parent) {
    LayoutInflater inflater =
            (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View rowView = inflater.inflate(R.layout.hrlistitems, parent, false);

    Button b = (Button) rowView.findViewById(R.id.HRlistB);
    b.setOnClickListener(onBButtonClicked);
    Drawable buttonBackground = b.getBackground();
    if(buttonBackground != null) {
        buttonBackground.setColorFilter(0xFFFF0000,PorterDuff.Mode.MULTIPLY);
        b.setBackground(buttonBackground);
    }

    return rowView;
}

但是,如果我说实话,我不明白你问题的第一部分:

  

颜色会按预期变化,但按钮的形状,大小和填充也会发生变化

我认为您的问题是您使用的是AppCompat主题,因此Button已更改为AppCompatButton

在这种情况下,如果要实现该结果,则必须使用setBackgroundTintList(ColorStateList tint)方法。 可以找到官方文档here

修改

我现在看到您的按钮没有背景,因为ColorFilter为空,您无法使用Drawable进行更改。