Как установить цвет сообщения об ошибке 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 / Результат:

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



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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.