Как я могу изменить цвет сообщения об ошибке, которое можно настроить так, чтобы оно отображалось под текстовым полем в TextInputLayout
(переход setError(...)
- см. Состояние ошибки здесь )?
Обычно он отображается красным цветом, который я хочу изменить. Какие имена / ключи элементов я должен использовать в моем styles.xml
файле, чтобы настроить цвет?
Заранее спасибо.
Редактировать:
Добавлен 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 / Результат:
Когда появляется сообщение об ошибке, подсказка над полем меняет цвет на тот же цвет, что и сообщение об ошибке, заменяя цвет подсказки - это сделано намеренно.
источник
Ответы:
Создайте собственный стиль, который будет использоваться в
@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">
Изменить: установите подсказку для объекта, который находится внутри вашего TextInputLayout (
EditText
,TextView
и т. Д.), Чтобы сохранить разные цвета для подсказки и ошибки.источник
app:errorTextAppearance
?<android.support.design.widget.TextInputLayout app:errorTextAppearance="@style/error_appearance"><AutoCompleteTextView android:hint="@string/prompt_email"/></android.support.design.widget.TextInputLayout>
. Так что да, это еще один TextView, поэтому он не берет цвет ошибки из TextInputLayout.parent
наparent="TextAppearance.Design.Error"
. Таким образом, он сохраняет размер текста по умолчанию и любые другие атрибуты, но вы можете специально настроить цвет ошибки, что и было целью рассматриваемого вопроса.Фактически, чтобы изменить только цвет сообщения об ошибке, вы можете установить
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>
источник
textColorError
не найдено), но мне удалось установитьcolorError
атрибут в своей теме. Похоже, что каждая версия Android / Support Library имеет свои собственные атрибуты темы.<item name="colorError">@color/error</item>
работает нормальноОдно примечание. Я попробовал одно из принятых решений
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>
источник
Мне нужно было делать это динамически. Использование отражения:
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)
перед вызовом вышеуказанного метода, чтобы это сработало.источник
С
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>
источник
ОБНОВИТЬ
Модифицированная версия @ 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(); } }
источник
Если вы используете 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>
источник
В зависимости от необходимости, можно изменять / устанавливать цвет текста 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:
<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>
источник
Я заглянул в источник TextInputLayout и понял, что цвет текста ошибки берется из colors.xml. Просто добавьте это в свой файл colors.xml:
<color name="design_textinput_error_color_light" tools:override="true">your hex color</color>
источник