Дизайн Android EditText, чтобы отобразить сообщение об ошибке, как описано в Google

Мне нужен EditText, который выглядит как this onError:

enter image description here

вызов функции onError выглядит следующим образом:

enter image description here

Примечание. приложение работает на SDK 19 (4.4.2)

min SDK равен 1

Есть ли метод, подобный setError, который делает это автоматически, или мне нужно написать код для этого?

Спасибо

Ответ 1

Нет необходимости использовать стороннюю библиотеку, так как Google ввел TextInputLayout как часть design-support-library.

Следуя базовому примеру:

Разметка

<android.support.design.widget.TextInputLayout
    android:id="@+id/text_input_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:errorEnabled="true">

    <android.support.design.widget.TextInputEditText
        android:id="@+id/edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter your name" />

</android.support.design.widget.TextInputLayout>

Примечание.. Установив app:errorEnabled="true" в качестве атрибута TextInputLayout, он не изменит его размер после отображения ошибки, поэтому он в основном блокирует пространство.

Код

Чтобы показать Ошибка ниже EditText, вам просто нужно вызвать #setError в TextInputLayout:

TextInputLayout til = (TextInputLayout) findViewById(R.id.text_input_layout);
til.setError("You need to enter a name");

Результат

picture showing the edit text with the error message

Чтобы скрыть ошибку и reset оттенок просто вызовите til.setError(null).


Примечание

Чтобы использовать TextInputLayout, вы должны добавить следующие к вашим зависимостям build.gradle:

dependencies {
    compile 'com.android.support:design:25.1.0'
}

Настройка пользовательского цвета

По умолчанию строка EditText будет красной. Если вам нужно отобразить другой цвет, вы можете использовать следующий код, как только вы вызываете setError.

editText.getBackground().setColorFilter(getResources().getColor(R.color.red_500_primary), PorterDuff.Mode.SRC_ATOP);

Чтобы очистить его, просто вызовите следующую строку:

editText.getBackground().clearColorFilter;

Ответ 2

Текст редактирования должен быть завернут в TextInputLayout

        <android.support.design.widget.TextInputLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tilEmail">
        <EditText
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:inputType="textEmailAddress"
            android:ems="10"
            android:id="@+id/etEmail"
            android:hint="Email"
            android:layout_marginTop="10dp"
             />
    </android.support.design.widget.TextInputLayout>

Чтобы получить сообщение об ошибке, как вы хотели, установите ошибку в текстовом макете ввода

TextInputLayout tilEmail = (TextInputLayout) findViewById(R.id.tilEmail);
if (error){
    tilEmail.setError("Invalid email id");    
}

Вы должны добавить зависимость библиотеки конструкторской поддержки. Добавьте эту строку в свои зависимости gradle

compile 'com.android.support:design:22.2.0'

Ответ 3

Ответ reVerse велик, но он не указал, как удалить всплывающую подсказку с плавающей ошибкой.

Вам понадобится edittext.setError(null), чтобы удалить это.
Кроме того, как заметил кто-то, вам не нужно TextInputLayout.setErrorEnabled(true)

Разметка

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:id="@+id/edittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter something" />
</android.support.design.widget.TextInputLayout>

код

TextInputLayout til = (TextInputLayout) editText.getParent();
til.setError("Your input is not valid...");
editText.setError(null);

Ответ 4

Вызовите myTextInputLayout.setError() вместо myEditText.setError().

Эти контейнеры и сдерживающие устройства имеют двойную функциональность при настройке ошибок. Функциональность, в которой вы нуждаетесь, является контейнерной. Но для этого вам может потребоваться минимальная версия 23.

Ответ 5

TextInputLayout til = (TextInputLayout)editText.getParent();
til.setErrorEnabled(true);
til.setError("some error..");