EditText setError()没有消息,只有图标。

41

目前我有一个非常简单的代码用于验证 EditText 字段,并且当用户点击按钮后会检查它们。它会在所有字段中放置错误:

if (!emailmatcher.matches()) {
    email.setError("Invalid Email");  
}
if (!zipmatcher.matches()) {
    zipcode.setError("Invalid ZipCode");                     
}

我的问题是键盘将弹出并将错误气泡移动到随机位置。我希望没有消息的错误气泡,但保留无效 EditText 字段中的错误图标。我尝试输入 setError(null),但不起作用。有什么想法吗?

5个回答

63

你的代码很好地展示了图标。

由于EditText在获得焦点时不会显示任何相关内容,因此只需将您的代码更改为以下内容...

if (!emailmatcher.matches()) {
    email.requestFocus();
    email.setError("Invalid Email");  
}
if (!zipmatcher.matches()) {
    zipcode.requestFocus();
    zipcode.setError("Invalid ZipCode");                     
}

1
如жһњж¶‰еЏЉзљ„EditTextеҢ“е‰ҚжІҰ有焦点пәЊй‚Әд№€setErrorзҰ®е®һдёҚдәљеә№е‡ғй”™иҮҮ消жЃҮгЂ‚ - Matthew Housser
@Sameer:谢谢。现在弹出错误消息。这对我有用。 - BK19

5
您可以使用setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.my_error_icon, 0);将错误图标设置到文本输入框右侧。您可能还需要注册View.OnKeyListener以在用户输入时重置错误图标:
EditText myEdit = (EditText)findViewById(R.id.my_edit);

if (TextUtils.isEmpty(myEdit.getText().toString())) {
    // set the warning
    myEdit.requestFocus();

    // show error icon
    myEdit.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.error_sign, 0);

    // remove the error icon on key press
    myEdit.setOnKeyListener(new OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {

            EditText eText = (EditText)v;

            // remove error sign
            eText.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);

            // remove this key handler
            eText.setOnKeyListener(null);

            return false;
        }
    });
}

3
这对我很有效。 现在会弹出错误提示信息。
public boolean isValid() {
        String email = ediTextEmail.getText().toString();
        String password = ediTextPassword.getText().toString();
        if (TextUtils.isEmpty(email)) {
            ediTextEmail.requestFocus();
            ediTextEmail.setError("Email cannot be blank");
            return false;
        }

        if (!isEmailValid(email)) {
            ediTextEmail.requestFocus();
            ediTextEmail.setError("Enter a valid email id");
            return false;
        }

        if (TextUtils.isEmpty(password)) {
            ediTextPassword.requestFocus();
            ediTextPassword.setError("Password cannot be blank");
            return false;
        }

        mEmail = email;
        mPassword = password;
        return true;
    }

即使我的焦点在密码输入框上,也会弹出电子邮件输入框


0

只需要创建自己的EditText并重写setError方法

    public class MyEditText extends EditText {

public MyEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public void setError(CharSequence error, Drawable icon) {
    setCompoundDrawables(null, null, icon, null);
 }
}  

然后在需要的地方使用 et.setError("", drawableToShow);


这对我不起作用,但是 setCompoundDrawablesWithIntrinsicBounds(null, null, icon, null); 似乎可以解决问题。 - petehallw

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接