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

как изменить цвет сообщения об ошибке, которое может отображаться под текстовым полем в TextInputLayout (via setError(...)посмотреть ошибки здесь)?

он обычно отображается как красный цвет, который я хочу изменить. Какие имена/ключи элементов я должен использовать в my 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):

обычный (не ошибка):

Before Image

ошибка состояния:

After Image

изменить 2/итог:

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

6 ответов


создать пользовательский стиль, который использует @android:style/TextAppearance как родитель :

<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

Edit: установите подсказку на объект, который находится внутри вашего TextInputLayout (EditText, TextView, etc.) для хранения различных цветов для подсказки и ошибки.


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

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

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) перед вызовом метода для этой работы.


С одной стороны Примечание. Я попробовал принятое решение с 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>

модифицированная версия ответа @jared, которая работает в моем случае:

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();
    }
}

Я посмотрел в источник TextInputLayout, и я понял, что цвет текста ошибки получен из цветов.XML. Просто добавьте это к вашим цветам.XML-код:

<color name="design_textinput_error_color_light" tools:override="true">your hex color</color>