Предложения клавиатуры приводят к тому, что часть сообщения Android EditText.setError() не отображается

Когда я использую edittext.setError("enter a comment") в android, он отлично работает до тех пор, пока не появятся предложения клавиатуры и ошибка будет превышена над edittext, после чего она не отобразит все сообщение об ошибке.

Почему он это делает?

After entering into the textbox, the balloon pop-up now appears above the textbox

Ответ 1

setError
Устанавливает правое соединение, пригодное для текста TextView, к значку "ошибка" и устанавливает сообщение об ошибке, которое будет отображаться во всплывающем окне, когда TextView имеет фокус. Значок и сообщение об ошибке будет reset равным нулю, если любые ключевые события вызывают изменения в Текст TextView. Если ошибка равна нулю, сообщение об ошибке и значок будут очищается.

Итак, когда текст изменен, он должен исчезнуть. Я не знаю, почему этого не происходит в вашем случае.

Он также должен быть очищен, если сообщение об ошибке равно null, поэтому один трюк может быть:

edittext = (EditText)findViewById(R.id.foo); // add below this line
edittext.addTextChangedListener(new TextWatcher() {
    public void afterTextChanged(Editable s) {}
    public void beforeTextChanged(CharSequence s, int start, int count, int after){}
    public void onTextChanged(CharSequence s, int start, int before, int count){
        if(s != null && s.length() > 0 && edittext.getErrorMessage() != null) {
            edittext.setErrorMessage(null);
        }
    }
}); 

Ответ 2

@Энди Лобель: Я также столкнулся с этой проблемой и исправил ее, добавив белые пробелы (10-12) в конец текста, поэтому усечение произошло только с белыми пробелами:) Кроме того, мой setError выглядел лучше, создав текст setError и EditText выровнены.

Другое дело: Я застрял в другой проблеме, в которой отображается отображаемый значок, но это плавающее сообщение и его прямоугольное поле не отображаются.

Мой макет содержит:

1) Имя пользователя Редактировать текст

2) Редактирование пароля

3) Подтверждение пароля Редактировать текст

4) Кнопка регистрации

Итак, я проверял и показывал ошибку во время нажатия кнопки "Регистрация" но выяснилось, что сообщение не появилось и доступно только для рисования и обнаружил, что сообщение появится только тогда, когда Редактирование текста будет сфокусировано как:

В соответствии с API setError Описание: - Устанавливает правое соединение с текстом TextView на значок ошибки и устанавливает сообщение об ошибке, которое будет отображаться во всплывающем окне , когда TextView имеет фокус.

Итак, сообщение предназначалось для UserName Edit Text, но последний фокус остался на экране Confirm Password Edit, поэтому он никогда не показывался

Решение/tweak для такого случая было бы:

EditText.setFocusableInTouchMode(true);
EditText.requestFocus();
EditText.setError("My Error Text");

Примечание.. Написал, на всякий случай, если вы застряли в этом вопросе, хотя другие решения могут быть доступны и извините за столь большое количество изменений, что это наилучшее возможное решение, которое я пришел наконец.

Ответ 3

Я потратил много времени, пытаясь исправить это...

Легкое исправление: - убедитесь, что текст ошибки действительно очень короткий

Исправление, из-за которого все это работает:

Когда Android отображает экранную клавиатуру, вид с текстом редактирования "перемещается" вверх... и текст ошибки перемещается вместе с этим. Усечение обычно происходит как часть этого. Вы можете легко исправить это, разместив весь свой макет в скобке ScrollView... таким образом, Android может перемещать ваш EditText, прокручивая его со всей компоновкой, - и затем сообщение об ошибке будет полностью отображено, Попробуйте - это действительно работает.

P.S: Мне нравится, что вы опубликовали скриншот своей проблемы. Делает вещи намного легче.

Ответ 4

Другое решение:
Добавление android:windowSoftInputMode="adjustResize" по тегу активности в AndroidManifest.xml исправил проблему для меня

Ответ 5

Задайте значение inputType="" для EditText с соответствующим значением android:inputType="textEmailAddress", и всплывающее окно исчезнет при вводе первого символа.