我的应用布局中有几个按钮,我想动态更改这些按钮的颜色。当我使用
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不起作用?
如何在不改变此按钮的任何其他内容(如大小等)的情况下为我的按钮着色作为副作用?
答案 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
进行更改。