2015-11-14 2 views
42

Как я могу изменить цвет сообщения об ошибке, которое может быть установлено под текстовым полем в TextInputLayout (через - see error state here)?Как установить цвет сообщения об ошибке TextInputLayout?

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

Regular (без ошибок):

Before Image

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

After Image

Редактировать/Результат:

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

+0

Возможного дубликат [Как писать стиль ошибок текста EditText в андроиде] (http://stackoverflow.com/questions/14413575/how-to-write -style-to-error-text-of-edittext-in-android) – random

+0

Цвет ошибки заменяет цвет подсказки в состоянии ошибки. Это по дизайну. См. Https://www.google.com/design/spec/components/text-fields.html#text-fields-character-counter. Вы не можете обойти это без изменения класса TextInputLayout. –

+0

@EugenPechanec Я не понимал, что это так. Спасибо за объяснение –

ответ

83

Создайте собственный стиль, который использует @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

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

+1

Спасибо. Кажется прямолинейным, но не может найти его для меня как-то! –

+1

Обновление: возможно ли изменить стиль сообщения об ошибке? Это, похоже, также изменяет стиль подсказки над полем. –

+0

Действительно? Не для меня, посмотрите на картинку выше. Вы уверены, что присваиваете стиль «app: errorTextAppearance»? – dabo

5

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

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

+0

его не работает :( –

+0

Это замечательно замечательно. Спасибо. – Shaishav

+0

Цвет текста ошибки меняется, но цвет подчеркивания остается It изменяется только при следующем вызове той же функции –

2

Modded версия Ответ @ Джареда, который работает в моем случае:

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

Цвет текста ошибки изменяется, но цвет подчеркивания остается Он изменяется только при следующем вызове той же функции –

+0

Не используйте это. Это ненадежное на данный момент –

12

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

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

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

Не работа для меня .. –

+0

Работает для меня с библиотекой дизайна. –