Дизайн 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..");