Подтвердить что ты не робот

EditText setError() без сообщения только значок

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.my_error_icon, 0);

чтобы установить значок ошибки справа от ввода текста. Возможно, вам также придется зарегистрировать

View.OnKeyListener - reset значок ошибки на входе пользователя:

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

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

Ответ 4

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

Ответ 5

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