动态地改变Android EditText的着色
动态地改变Android EditText的着色
我正在尝试在运行时以编程方式更改EditText
视图的着色颜色。基本上,我想要更改通常应用为?attr/colorControlNormal
的内容,就像在默认背景可绘制物中一样。
通过只设置一个颜色的new ColorsStateList
不能正确地应用更改背景着色:
editText.setBackgroundTintList(ColorStateList.valueOf(color));
首先,结果会应用于所有的EditText
,尽管着色列表被应用并且在内部改变了可绘制物。此外,默认背景1中指定的alpha在开始时是可见的。
以下是仅在第一个EditText
上设置着色颜色的结果:
所以我的问题是:我如何正确地将着色以编程方式应用于EditText
?
问题的原因是尝试在构造函数中通过`this.setBackgroundTintList(ColorStateList.valueOf(color));`改变`EditText`的颜色,但这种方式只能在创建时生效,无法在运行时动态改变颜色。
解决方法是创建一个自定义的`EditText`并添加一个监听器,在需要改变颜色的时候调用该监听器。这样做不会创建新的`View`,也不需要复制`TextView`当前的状态。
具体实现方法是在自定义的`EditText`类中创建一个监听器,然后在需要改变颜色的时候调用该监听器。这样,每个`EditText`都会响应该监听器。
需要注意的是,监听器不能直接创建在构造函数中,而是需要在类中像普通方法一样创建。
代码示例:
public class CustomEditText extends EditText { private OnColorChangeListener listener; public void setOnColorChangeListener(OnColorChangeListener listener) { this.listener = listener; } public interface OnColorChangeListener { void onColorChange(int color); } private void changeColor(int color) { // 改变颜色的逻辑 // 调用监听器 if (listener != null) { listener.onColorChange(color); } } }
在使用的时候,可以通过调用`setOnColorChangeListener`方法来设置监听器,然后在需要改变颜色的时候调用`changeColor`方法:
CustomEditText editText = new CustomEditText(); editText.setOnColorChangeListener(new CustomEditText.OnColorChangeListener() { @Override public void onColorChange(int color) { // 处理颜色改变逻辑 } }); // 在需要改变颜色的时候调用 editText.changeColor(newColor);
问题的出现原因是在Android中,更改EditText的tint颜色时,如果不调用mutate()方法,则颜色更改将在多个EditText之间共享,导致旧的和新的颜色混合在一起。
解决方法是在更改颜色之前调用mutate()方法,以确保只临时更改单个EditText的颜色,而不影响其他EditText。此外,还要保存旧的Background,以便在需要时进行重置。
以下是解决方法的代码示例:
editText.getBackground().mutate().setColorFilter(getResources().getColor(R.color.your_color), PorterDuff.Mode.SRC_ATOP);
通过调用mutate()方法,确保仅更改当前EditText的颜色。然后使用setColorFilter()方法设置所需的颜色。最后,使用PorterDuff.Mode.SRC_ATOP模式指定如何处理颜色过滤器。
此解决方法可以在需要临时更改EditText颜色的情况下使用,例如标记错误时。