Como posso alterar a cor da mensagem de erro que pode ser definida para aparecer abaixo do campo de texto em um TextInputLayout
(via setError(...)
- veja o estado de erro aqui )?
Normalmente aparece como uma cor vermelha, que desejo alterar. Quais nomes / chaves de item devo usar em meu styles.xml
arquivo para direcionar a cor?
Desde já, obrigado.
Editar:
Adicionada app:errorTextAppearance
chave ao meu 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>
e a aparência do erro (definido como verde para teste) :
<style name="WelcomeErrorAppearance" parent="@android:style/TextAppearance">
<item name="android:textColor">@android:color/holo_green_dark</item>
</style>
O resultado é que a dica, bem como a mensagem de erro, são coloridas (capturas de tela do emulador Android em escala) :
Regular (sem erro):
Estado de erro:
Editar 2 / Resultado:
Quando a mensagem de erro aparece, a dica acima do campo muda para a mesma cor da mensagem de erro, substituindo a cor da dica - isso ocorre por design.
fonte
Respostas:
Crie um estilo personalizado que use
@android:style/TextAppearance
como principal em seustyles.xml
arquivo:<style name="error_appearance" parent="@android:style/TextAppearance"> <item name="android:textColor">@color/red_500</item> <item name="android:textSize">12sp</item> </style>
E use-o em seu widget 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">
Edit: Defina a dica sobre o objeto, o que está dentro de seu TextInputLayout (
EditText
,TextView
, etc.) para manter cores diferentes para a dica e o erro.fonte
app:errorTextAppearance
?<android.support.design.widget.TextInputLayout app:errorTextAppearance="@style/error_appearance"><AutoCompleteTextView android:hint="@string/prompt_email"/></android.support.design.widget.TextInputLayout>
. Então, sim, é outro TextView, é por isso que ele não pega a cor de erro do TextInputLayout.parent
comoparent="TextAppearance.Design.Error"
. Dessa forma, ele retém o tamanho do texto padrão e quaisquer outros atributos, mas permite que você personalize especificamente a cor do erro, que era o objetivo da questão em questão.Na verdade, para alterar apenas a cor da mensagem de erro, você pode definir
textColorError
em seu tema (e também definircolorControlNormal
ecolorControlActivated
para o widget geral e cor de texto de dica).TextInputLayout
pega esse atributo. NOTA: se você definirerrorTextAppearance
um estilo personalizado,textColorError
não terá efeito.<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>
E em seu AndroidManifest.xml:
<application android:theme="@style/AppTheme" android:icon="@drawable/ic_launcher" android:label="@string/app_name"> <!-- ... --> </application>
fonte
textColorError
não encontrado), mas consegui definircolorError
atributo no meu tema. Parece que cada versão da Biblioteca de suporte / Android tem seus próprios atributos de tema.<item name="colorError">@color/error</item>
funciona bemUma nota lateral. Eu tentei a solução aceita com um
errorTextAppereance
. Funciona muito bem, mas no início, a cor do sublinhado de entrada não mudou após a aplicação de um novoerrorTextAppereance
estilo. Vejo que há alguns comentários e que outras pessoas estão enfrentando o mesmo problema.No meu caso, isso estava acontecendo quando eu estava definindo um novo estilo após definir um novo texto de erro. Como isso:
passwordInputLayout.error = "Password strength" passwordInputLayout.setErrorTextAppearance(R.style.InputError_Purple)
Depois de trocar a ordem desses dois métodos, o texto e a cor do sublinhado mudam conforme o esperado.
passwordInputLayout.setErrorTextAppearance(R.style.InputError_Purple) passwordInputLayout.error = "Password strength"
E o estilo de aparência do texto de erro é mais ou menos assim:
<style name="InputError" parent="TextAppearance.Design.Error"/> <style name="InputError.Purple"> <item name="android:textColor">@color/purple</item> </style>
fonte
Eu precisava fazer isso dinamicamente. Usando reflexão:
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(); } }
Você precisará chamar
textInputLayout.setErrorEnabled(true)
antes de invocar o método acima para que isso funcione.fonte
Com o
TextInputLayout
incluído na Biblioteca de Componentes de Materiais, basta usar oapp:errorTextColor
atributo.<com.google.android.material.textfield.TextInputLayout app:errorTextColor="@color/...." .../>
Em um estilo personalizado, você pode usar:
<style name="..." parent="Widget.MaterialComponents.TextInputLayout.FilledBox" > <item name="errorTextColor">@color/...</item> ... </style>
fonte
ATUALIZAR
Uma versão modificada da resposta de @jared que funciona no meu caso:
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(); } }
fonte
Se você estiver usando com.google.android.material.textfield.TextInputLayout este layout de entrada, basta definir um estilo
<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>
fonte
Dependendo da necessidade, é possível alterar / definir a cor do texto TextInputLayout dinamicamente ou diretamente no arquivo XML de layout. Abaixo está um exemplo de snippets de código
Crie um estilo personalizado que use @android: style / TextAppearance como pai em seu arquivo 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>
E use-o em seu widget TextInputLayout:
<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">
your_input_layout.setErrorTextAppearance(R.style.style_error_appearance);
Se você deseja definir uma única / mesma cor de texto de erro para seu aplicativo, defina a cor do texto no tema do aplicativo
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Error text color... --> <item name="textColorError">@color/color_error</item> <!-- other styles... --> </style>
E em seu AndroidManifest.xml:
<application android:theme="@style/AppTheme" android:icon="@drawable/ic_launcher" android:label="@string/your_app_name"> <!-- ... --> </application>
fonte
Eu olhei para a fonte TextInputLayout e percebi que a cor do texto de erro é obtida de colors.xml. Basta adicionar ao seu colors.xml:
<color name="design_textinput_error_color_light" tools:override="true">your hex color</color>
fonte