setCompoundDrawablesWithIntrinsicBounds无法正常工作

时间:2016-01-22 10:09:10

标签: android android-edittext

我的电子邮件字段为EditText。我试图在验证为真时在文本字段的末尾添加绿色勾号图标,并在错误时添加setError

这是我现在正在使用的代码:

email.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                String mail = email.getText().toString();
                if(!android.util.Patterns.EMAIL_ADDRESS.matcher(mail).matches()) {
                    email.setError("Please enter a valid email address");
                } 
                else {
                    Log.i("YaY","Email is valid!!!");
                    email.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.validated, 0);
                }
            }
        }
    });

问题:

虽然我可以看到日志Yay: Email is valid!!!,但似乎没有设置图标,因为我无法看到它。 但是当我将if-condition更改为false时,这意味着永远不会调用setError,我可以看到日志和图标。

我为什么会看到这种奇怪行为的任何解释?我错过了什么?

2 个答案:

答案 0 :(得分:10)

如果要设置任何图标,请尝试从xml中删除该图标 并从代码中设置两个图像 由于某种原因,如果您从xml

设置图像,则图像不会刷新

并使用

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
          numTxt.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.icon, 0, 0, 0);
    } else {    
          numTxt.setCompoundDrawablesWithIntrinsicBounds(R.drawable.icon, 0, 0, 0);
    }

答案 1 :(得分:1)

我不确定这是否是一个错误,但我可以通过在分配新的drawable之前先将drawable设置为零(0)来解决此问题。

在您的情况下,您可以尝试以下方法:

Log.i("YaY","Email is valid!!!");
email.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
email.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.validated, 0);