Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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:

  1. Непосредственно в 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">
  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>

Ответ 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>