Как установить цвет сообщения об ошибке TextInputLayout?

90

Как я могу изменить цвет сообщения об ошибке, которое можно настроить так, чтобы оно отображалось под текстовым полем в 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 / Результат:

Когда появляется сообщение об ошибке, подсказка над полем меняет цвет на тот же цвет, что и сообщение об ошибке, заменяя цвет подсказки - это сделано намеренно.

Себ Ячек
источник
Возможный дубликат Как написать стиль в текст ошибки EditText в Android?
случайный
Цвет ошибки заменяет цвет подсказки в состоянии ошибки. Это сделано намеренно. См. Google.com/design/spec/components/… Вы не можете обойти это, не изменив класс TextInputLayout.
Eugen Pechanec
@EugenPechanec Я не понимал, что это так. Спасибо за объяснение
Seb Jachec
1
@EugenPechanec Я почти уверен, что вы ошибаетесь. Речь идет о счетчике символов. Для нормальных полой ошибка должна выглядеть на этом изображении (заметьте , что подсказка не окрашенная) material-design.storage.googleapis.com/publish/material_v_4/...
ARKADIUSZ 'мух Rzadkowolski
2
@EugenPechanec code.google.com/p/android/issues/detail?id=195775 - это действительно была ошибка, и она будет исправлена ​​в будущем выпуске :)
Аркадиуш «летает» Рзадковольски

Ответы:

140

Создайте собственный стиль, который будет использоваться в @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и т. Д.), Чтобы сохранить разные цвета для подсказки и ошибки.

dabo248
источник
1
Спасибо. Кажется простым, но я почему-то не мог этого найти!
Seb Jachec
2
Обновление: можно ли просто изменить стиль сообщения об ошибке? Похоже, это также меняет стиль подсказки над полем.
Seb Jachec
В самом деле? Не для меня, посмотрите на картинку выше. Вы уверены, что назначаете стиль app:errorTextAppearance?
dabo248
1
@EugenPechanec Упрощенное это выглядит следующим образом : <android.support.design.widget.TextInputLayout app:errorTextAppearance="@style/error_appearance"><AutoCompleteTextView android:hint="@string/prompt_email"/></android.support.design.widget.TextInputLayout>. Так что да, это еще один TextView, поэтому он не берет цвет ошибки из TextInputLayout.
dabo248
7
Если вы хотите изменить только цвет, лучше всего установить стиль parentна parent="TextAppearance.Design.Error". Таким образом, он сохраняет размер текста по умолчанию и любые другие атрибуты, но вы можете специально настроить цвет ошибки, что и было целью рассматриваемого вопроса.
w3bshark 09
28

Фактически, чтобы изменить только цвет сообщения об ошибке, вы можете установить 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>
Вики Чижвани
источник
17
Кто-то действительно должен написать книгу о темах, стилях и всех возможных атрибутах. Это действительно безумие, вы можете установить цвет и стиль множеством способов, и нет никакого способа узнать, какой из них правильный. И, конечно, документации нет вообще :( Я имею в виду, что есть, но это действительно сбивает с толку.
aleksamarkoni
это гораздо лучший ответ, чем тот, который набрал больше очков!
philthomas26
6
Для меня это решение вызвало ошибку ( textColorErrorне найдено), но мне удалось установить colorErrorатрибут в своей теме. Похоже, что каждая версия Android / Support Library имеет свои собственные атрибуты темы.
Slav
9
Я получаю сообщение «Ошибка при связывании ресурсов Android», но все <item name="colorError">@color/error</item>работает нормально
m4n3k4s
4
Пожалуйста, обновите сообщение .. textColorError теперь colorError.
Мэтт Вулф
7

Одно примечание. Я попробовал одно из принятых решений 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>
Иван Марич
источник
Как выглядит ваш R.style.InputError_Purple?
toobsco42
Стиль @ toobsco42 определяет только цвет текста. Я отредактировал ответ с фактической реализацией.
Иван Марич
Спасибо! Я использую это представление как для действительного текста, так и для текста ошибки (зеленого и красного), а неправильное изменение цвета подчеркивания сводило меня с ума.
rexar5 06
6

Мне нужно было делать это динамически. Использование отражения:

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)перед вызовом вышеуказанного метода, чтобы это сработало.

Джаред Раммлер
источник
Цвет текста ошибки меняется, но цвет подчеркивания остается. Он изменяется только при следующем вызове той же функции
Мохаммад Шабаз Муса
@ Dr.aNdRO Использует отражение, не всегда работает!
ucMedia
3

С 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>

введите описание изображения здесь

Габриэле Мариотти
источник
1

ОБНОВИТЬ

Вместо этого используйте пользовательский вид, а не этот


Модифицированная версия @ 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();
    }
}
Доктор АНДРО
источник
Цвет текста ошибки меняется, но цвет подчеркивания остается. Он изменяется только при следующем вызове той же функции
Мохаммад Шабаз Муса
2
Не используйте это. на данный момент это ненадежно
Dr. aNdRO
0

Если вы используете 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>
Мохит Сутар
источник
0

В зависимости от необходимости, можно изменять / устанавливать цвет текста 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:

  1. Непосредственно в XML Layout
 <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">
  1. Динамично в вашем классе
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>
Рупеш Ядав
источник
-2

Я заглянул в источник TextInputLayout и понял, что цвет текста ошибки берется из colors.xml. Просто добавьте это в свой файл colors.xml:

<color name="design_textinput_error_color_light" tools:override="true">your hex color</color>
Java Geek
источник
У меня работает с добавленной библиотекой дизайна.
Java Geek