Как установить цвет сообщения об ошибках TextInputLayout?
Как изменить цвет сообщения об ошибке, который может быть установлен под текстовым полем в TextInputLayout
(через setError(...)
- см. здесь состояние ошибки)?
Обычно он отображается как красный цвет, который я хочу изменить. Какие имена/ключи элементов следует использовать в моем styles.xml
файле для печати цвета?
Спасибо заранее.
Edit:
Добавлен ключ app:errorTextAppearance
к моему TextInputLayout
:
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:id="@+id/welcome_current_week_container"
app:errorTextAppearance="@style/WelcomeErrorAppearance">
<EditText
..../>
</android.support.design.widget.TextInputLayout>
</LinearLayout>
и внешний вид ошибки (зеленый для тестирования):
<style name="WelcomeErrorAppearance" parent="@android:style/TextAppearance">
<item name="android:textColor">@android:color/holo_green_dark</item>
</style>
Результат заключается в том, что подсказка, а также сообщение об ошибке окрашены (скриншоты из масштабированного эмулятора Android):
Обычный (без ошибок):
![Перед изображением]()
Состояние ошибки:
![После изображения]()
Изменить 2/Результат:
Когда появится сообщение об ошибке, подсказка над полем изменится на тот же цвет, что и сообщение об ошибке, переопределяя цвет подсказки - это по дизайну.
Ответы
Ответ 1
Создайте собственный стиль, который использует @android:style/TextAppearance
как родительский элемент в файле styles.xml
:
<style name="error_appearance" parent="@android:style/TextAppearance">
<item name="android:textColor">@color/red_500</item>
<item name="android:textSize">12sp</item>
</style>
И используйте его в виджетах TextInputLayout:
<android.support.design.widget.TextInputLayout
android:id="@+id/emailInputLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:errorTextAppearance="@style/error_appearance">
![error example]()
Изменить: Установите подсказку для объекта, который находится внутри вашего TextInputLayout (EditText
, TextView
и т.д.), чтобы удерживать разные цвета для подсказки и ошибки.
Ответ 2
Собственно, чтобы изменить только цвет сообщения об ошибке, вы можете установить textColorError
в своей теме (а также установить colorControlNormal
и colorControlActivated
для общего цвета виджета и цвета подсказки). TextInputLayout
берет этот атрибут. ПРИМЕЧАНИЕ:, если вы установите errorTextAppearance
в пользовательский стиль, тогда textColorError
не будет иметь эффекта.
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorControlNormal">@color/control_normal</item>
<item name="colorControlActivated">@color/control_activated</item>
<item name="textColorError">@color/error</item>
<!-- other styles... -->
</style>
И в вашем AndroidManifest.xml:
<application
android:theme="@style/AppTheme"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<!-- ... -->
</application>
Ответ 3
Мне нужно было сделать это динамически. Использование отражения:
public static void setErrorTextColor(TextInputLayout textInputLayout, int color) {
try {
Field fErrorView = TextInputLayout.class.getDeclaredField("mErrorView");
fErrorView.setAccessible(true);
TextView mErrorView = (TextView) fErrorView.get(textInputLayout);
Field fCurTextColor = TextView.class.getDeclaredField("mCurTextColor");
fCurTextColor.setAccessible(true);
fCurTextColor.set(mErrorView, color);
} catch (Exception e) {
e.printStackTrace();
}
}
Вам нужно будет вызвать textInputLayout.setErrorEnabled(true)
, прежде чем использовать вышеупомянутый метод для этого.
Ответ 4
Одна сторона записка. Я попробовал принятое решение одно с errorTextAppereance
. Это работает действительно хорошо, но сначала цвет подчеркивания ввода не изменился после применения нового стиля errorTextAppereance
. Я вижу, что есть несколько комментариев, и что другие люди испытывают ту же проблему.
В моем случае это происходило, когда я устанавливал новый стиль после установки нового текста ошибки. Как это:
passwordInputLayout.error = "Password strength"
passwordInputLayout.setErrorTextAppearance(R.style.InputError_Purple)
После переключения порядка этих двух методов цвет текста и подчеркивания изменяется, как и ожидалось.
passwordInputLayout.setErrorTextAppearance(R.style.InputError_Purple)
passwordInputLayout.error = "Password strength"
И стиль отображения текста ошибки выглядит примерно так:
<style name="InputError" parent="TextAppearance.Design.Error"/>
<style name="InputError.Purple">
<item name="android:textColor">@color/purple</item>
</style>
Ответ 5
ОБНОВИТЬ
Пожалуйста, используйте вместо этого пользовательский вид, а не этот
Модифицированная версия @jared Answer, которая работает в моем случае:
public static void setErrorTextColor(TextInputLayout textInputLayout, int color) {
try {
Field fErrorView = TextInputLayout.class.getDeclaredField("mErrorView");
fErrorView.setAccessible(true);
TextView mErrorView = (TextView)fErrorView.get(textInputLayout);
mErrorView.setTextColor(color);
mErrorView.requestLayout();
} catch (Exception e) {
e.printStackTrace();
}
}
Ответ 6
Если вы используете com.google.android.material.textfield.TextInputLayout для этого макета ввода, чем просто установить один стиль
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/textInputLayoutPassword"
style="@style/LoginTextInputLayoutStyle"
<style name="LoginTextInputLayoutStyle" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense">
<item name="boxStrokeColor">@color/text_input_box</item>
<item name="errorTextColor">@color/colorRed</item>
</style>
Ответ 7
В зависимости от необходимости можно изменить/установить цвет текста TextInputLayout динамически или непосредственно в XML файле макета. Ниже приведены примеры фрагментов кода
.Создайте собственный стиль, который использует @android: style/TextAppearance в качестве родителя в файле styles.xml :
<style name="style_error_appearance" parent="@android:style/TextAppearance">
<item name="android:textColor">@color/color_error</item>
<item name="android:textSize">11sp</item>
</style>
И используйте его в своем виджете TextInputLayout:
-
Непосредственно в XML-макете
<android.support.design.widget.TextInputLayout
android:id="@+id/your_input_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:errorTextAppearance="@style/style_error_appearance">
- Динамически в вашем классе
your_input_layout.setErrorTextAppearance(R.style.style_error_appearance);
Если вы хотите установить одинаковый/одинаковый цвет текста ошибки для своего приложения, определите цвет текста в своей теме приложения
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Error text color... -->
<item name="textColorError">@color/color_error</item>
<!-- other styles... -->
</style>
И в вашем AndroidManifest.xml:
<application
android:theme="@style/AppTheme"
android:icon="@drawable/ic_launcher"
android:label="@string/your_app_name">
<!-- ... -->
</application>
Ответ 8
С TextInputLayout
, включенным в Библиотеку компонентов материала, просто используйте атрибут app:errorTextColor
.
<com.google.android.material.textfield.TextInputLayout
app:errorTextColor="@color/...."
.../>
В пользовательском стиле вы можете использовать:
<style name="..." parent="Widget.MaterialComponents.TextInputLayout.FilledBox" >
<item name="errorTextColor">@color/...</item>
...
</style>
![enter image description here]()
Ответ 9
Я просмотрел источник TextInputLayout и понял, что цвет текста ошибки получен из цвета .xml. Просто добавьте это в свои цвета .xml:
<color name="design_textinput_error_color_light" tools:override="true">your hex color</color>