动态地改变Android EditText的着色

11 浏览
0 Comments

动态地改变Android EditText的着色

我正在尝试在运行时以编程方式更改EditText视图的着色颜色。基本上,我想要更改通常应用为?attr/colorControlNormal的内容,就像在默认背景可绘制物中一样。

通过只设置一个颜色的new ColorsStateList不能正确地应用更改背景着色:

editText.setBackgroundTintList(ColorStateList.valueOf(color));

首先,结果会应用于所有的EditText,尽管着色列表被应用并且在内部改变了可绘制物。此外,默认背景1中指定的alpha在开始时是可见的。

以下是仅在第一个EditText上设置着色颜色的结果:

outcome of setting the tint color on just the first EditText

所以我的问题是:我如何正确地将着色以编程方式应用于EditText

0
0 Comments

问题的出现原因:使用DrawableCompat.setTint方法设置EditText的背景颜色后,无法将背景颜色重置为默认值。

解决方法:调用editText.setBackground方法将背景设置为旧的背景,以解决颜色在活动和非活动状态下混合的问题。具体代码如下:

editText.setBackground(oldBackground);

这样,EditText在非活动状态下使用旧的颜色,在活动状态下使用新的颜色,实现两者之间的混合效果。

0
0 Comments

问题的原因是尝试在构造函数中通过`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);

0
0 Comments

问题的出现原因是在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颜色的情况下使用,例如标记错误时。

0