Android如何复制EditText可绘制背景?

时间:2012-05-11 17:35:52

标签: java android drawable background-color

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

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

我尝试保存背景并在之后恢复它。并使用新的bakground将其涂成红色。下面的代码不起作用,因为 tv.getBackground()返回对 originalBg errorBg 的相同引用。当我将滤色器设置为 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) {}

    });

3 个答案:

答案 0 :(得分:1)

您是否尝试过创建副本:

 final Drawable originalBg = tv.getBackground();
 final BitmapDrawable errorBg = new BitmapDrawable(getResources(), (BitmapDrawable) tv.getBackground();

答案 1 :(得分: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();
   }

答案 2 :(得分:0)

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

<?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文件夹中,并使用EditText上的setBackgroundDrawable()方法来使用它。您可能需要使用颜色和角半径来获得它想要的方式。不完全是你的问题的答案,但希望它可以帮助。