EditText setError () без сообщения только значок - PullRequest
36 голосов
/ 30 июня 2011

В настоящее время у меня есть действительно простой код, который проверяет поля EditText, и когда пользователь нажимает кнопку в конце, он проверяет их. Это будет помещать ошибки во все поля с этим:

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

Моя проблема в том, что клавиатура всплывает и перемещает сообщение об ошибке в случайное место. Я надеялся, что сообщение об ошибке не будет пузыриться с сообщением, но оставил значки ошибок в недопустимых полях EditText. Я попытался ввести setError(null), но это не работает. Есть идеи?

Ответы [ 5 ]

56 голосов
/ 30 июля 2012

Ваш код идеально подходит для показа только значков.

Как EditText показывает все, что связано с фокусировкой. Так что просто поменяй свой код на такой ...

if (!emailmatcher.matches()) {
    email.requestFocus();
    email.setError("Invalid Email");  
}
if (!zipmatcher.matches()) {
    zipcode.requestFocus();
    zipcode.setError("Invalid ZipCode");                     
}
5 голосов
/ 01 января 2012

Вы можете использовать

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;
        }
    });
}
2 голосов
/ 05 октября 2016

Это работает для меня. Теперь появляются сообщения об ошибках.

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;
    }

Поп открылся, даже если мой фокус на password editText, он будет перенаправлен на email editText.

0 голосов
/ 23 октября 2015

Вы можете использовать мое решение для всплывающих окон.В этом случае всплывающее окно не зависит от состояния фокуса EditText.Кроме того, его можно использовать с несколькими EditTexts.https://plus.google.com/+AlexanderZaitsevDev/posts/W9XcZNZrsMB

0 голосов
/ 06 мая 2015

просто создайте свой собственный текст редактирования и переопределите 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);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...