0

当验证失败时,我想更改我的edittext的背景颜色为红色,然后,当用户开始更正它时,返回原始颜色。

EditText 有圆角边框,因此在这里使用setBackgroundColor( )不起作用,因为它绘制了一个丑陋的矩形而不是漂亮的圆角矩形。

我试图保存背景并在之后恢复它。并使用新的 bakground 将其涂成红色。下面的代码不起作用,因为tv.getBackground()返回对originalBgerrorBg的相同引用。当我将滤色器设置为errorBg 时,我实际上也将其更改为originalBg

如何将背景对象复制errorBg 中,以便在那里更改颜色?

    final Drawable originalBg = tv.getBackground();
    final Drawable errorBg = tv.getBackground();   <-- this does not create a new Drawable, just the same reference
    errorBg.setColorFilter(0xFFff6347, Mode.MULTIPLY);
    tv.setBackgroundDrawable(errorBg);
    tv.invalidate();
    tv.addTextChangedListener(new TextWatcher() {

        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            tv.setBackgroundDrawable(originalBg);
            tv.invalidate();
        }

        public void afterTextChanged(Editable s) {}

        public void onTextChanged(CharSequence s, int start, int before, int count) {}

    });
4

3 回答 3

1

您是否尝试过创建副本:

 final Drawable originalBg = tv.getBackground();
 final BitmapDrawable errorBg = new BitmapDrawable(getResources(), (BitmapDrawable) tv.getBackground();
于 2012-05-11T17:43:44.143 回答
1

您可以使用 setColorFilter(null) 删除颜色过滤器

tv.getBackgroundDrawable().setColorFilter(0xFFff6347, Mode.MULTIPLY);
tv.invalidate();
tv.addTextChangedListener(new TextWatcher() {

   public void beforeTextChanged(CharSequence s, int start, int count, int after) {
               tv.getBackgroundDrawable().setColorFilter(null);
               tv.invalidate();
   }
于 2012-05-11T17:47:52.683 回答
0

您可以创建一个 xml 文件,该文件定义一个带有圆角的可绘制对象以用作您的背景。

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <solid android:color="#ff6347"/>
    <corners android:radius="3dp"/>
</shape>

将此文件放在您的 drawables 文件夹中,并使用setBackgroundDrawable()EditText 上的方法来使用它。您可能需要使用颜色和圆角半径来获得您想要的效果。不完全是您问题的答案,但希望它可以提供帮助。

于 2012-05-11T17:44:52.630 回答