Como alterar a cor do traço inativo da borda do componente Android Material TextInputLayout
Estou tentando configurar a cor do traço da borda sem foco TextInputLayout. Para o mesmo, existem muitas perguntas e suas respostas e eu tentei todas elas. Como os estilos criados e usados como tema, o seletor de cores criado e aplicado, e também aplicado diretamente app: boxStrokeColor com seletor de cores. Mas não teve sorte com nenhuma dessas soluções disponíveis.
Não tenho certeza, onde estou fazendo errado ou algo que ainda estou perdendo. Eu empurrei meu código para o projeto de teste no github para obter melhor visibilidade de toda a minha configuração. Aqui está um exemplo de código para revisão rápida:
activity_main.xml (TextInputLayout dentro de ConstraintLayout)
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!-- Tried this as well - app:boxStrokeColor="@color/text_input_box_stroke_color" -->
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/emailTextInputLayout"
android:hint="Email"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:theme="@style/TextInputLayoutStyle"
android:layout_marginHorizontal="24dp"
app:layout_constraintTop_toBottomOf="@id/toolbar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/emailTextInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:importantForAutofill="no"
android:inputType="textEmailAddress" />
</com.google.android.material.textfield.TextInputLayout>
styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="TextInputLayoutStyle" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense">
<item name="boxStrokeColor">#FF00CC</item>
<item name="boxStrokeWidth">2dp</item>
</style>
</resources>
text_input_box_stroke_color.xml (seletor de cores)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/mtrl_textinput_focused_box_stroke_color" android:state_focused="true"/>
<item android:color="@color/mtrl_textinput_hovered_box_stroke_color" android:state_hovered="true"/>
<item android:color="@color/mtrl_textinput_disabled_color" android:state_enabled="false"/>
<item android:color="@color/mtrl_textinput_default_box_stroke_color"/>
</selector>
Seria de grande ajuda se alguém pudesse fornecer algumas orientações e sugestões e me ajudar a descobrir qualquer erro cometido por mim.
Desde já, obrigado.
Respostas
Testei seu código e ele funciona depois que você faz as alterações abaixo:
1. Primeiro mude seu res / color / text_input_box_stroke_color.xml como abaixo para ver as cores dos diferentes estados. No exemplo a seguir, eu defini uma cor vermelha para o estado em foco e uma cor azul claro para o estado inativo padrão:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@android:color/holo_red_dark" android:state_focused="true" />
<item android:color="@android:color/holo_green_dark" android:state_hovered="true" />
<item android:color="@color/mtrl_textinput_disabled_color" android:state_enabled="false" />
<item android:color="@android:color/holo_blue_light" />
</selector>
2. Em seguida, altere seu res / values / styles.xml com o boxStrokeColor vinculando ao seletor acima como abaixo:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="TextInputLayoutStyle" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense">
<item name="boxStrokeColor">@color/text_input_box_stroke_color</item>
<item name="boxStrokeWidth">2dp</item>
</style>
</resources>
3.Finalmente em seu TextInputLayout adicione este estilo como abaixo:
<com.google.android.material.textfield.TextInputLayout
style="@style/TextInputLayoutStyle"
android:id="@+id/emailTextInputLayout"
Atualmente, você está adicionando o estilo como: android: theme = "@ style / TextInputLayoutStyle" em vez de style = "@ style / TextInputLayoutStyle"
A solução para isso é a próxima, e funciona porque SÓ AGORA testei.
Vá para colors.xml
dentro de sua res>values
pasta.

Lá você terá a sua colorPrimary
e outras cores que você já criou antes. Role até o final e adicione esta linha:
<color name="mtrl_textinput_default_box_stroke_color" tools:override="true">@color/colorPrimary</color>
Quando você faz isso, você pode simplesmente mudar a cor lá. Eu defini como, @color/colorPrimary
mas você pode usar o que quiser. Antes de aplicar esta linha, entendi:

E depois de aplicar essa linha, este é o resultado:

Também me inscrevi style="@style/YourStyle"
para ambos TextInputLayout
eTextInputEditText
Crie uma cor de traço de caixa para o estado ativo e inativo como abaixo: box_stroke_color
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#2C2C2C" android:state_focused="true"/>
<item android:color="#2C2C2C" android:state_hovered="true"/>
<item android:color="#D7D7D7"/>
</selector>
Faça um estilo TextInputLayout : TextInputLayoutStyle
<style name="TextInputLayoutStyle" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox">
<item name="boxStrokeColor">@color/box_stroke_color</item>
<item name="boxStrokeWidth">1dp</item>
</style>
Use em seu TextInputLayout
<com.google.android.material.textfield.TextInputLayout
style="@style/TextInputLayoutStyle" >
<com.google.android.material.textfield.TextInputEditText.. />
</com.google.android.material.textfield.TextInputLayout>