Изменить цвет границы TextInputLayout в нефокусированном состоянии

У меня есть TextInputLayout с TextInputEditText внутри. TextInputLayout реализует тему, чтобы его цвет границы был желтым, когда он сфокусирован и не сфокусирован:

ТекстИнпутРедактироватьТекст:

style="@style/MyTextInputLayout"

MyTextInputLayout:

<style name="MyTextInputLayout" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox">
    <item name="boxStrokeColor">@color/edit_textbox_color</item>
</style> 

edit_textbox_color:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="?attr/colorPrimary" android:state_focused="true"/>
    <item android:alpha="0.87" android:color="@color/colorPrimary" android:state_hovered="true"/>
    <item android:alpha="0.12" android:color="@color/colorPrimary" android:state_enabled="false"/>
    <item android:alpha="0.38" android:color="@color/colorPrimary"/>
</selector>

 <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/layout_email_wrapper"
        style="@style/MyTextInputLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/margin_8"
        android:layout_marginStart="@dimen/margin_medium"
        android:layout_marginTop="@dimen/margin_ultra_big"
        android:layout_marginEnd="@dimen/margin_medium"
        android:hint="Password"
        app:errorEnabled="true">

Это работает, но теперь я пытаюсь найти способ изменить цвет границы, если значение внутри поля правильное.

Поэтому я пишу:

RxTextView.textChanges(emailNew).subscribe(
            value -> {
                isPasswordCorrect = isValidEmail(value.toString());
                if (isPasswordCorrect) {
                   //???                  
                }
            }));

..и я не знаю что делать. Я не могу динамически менять свою тему, а другие решения (например, setBoxStrokeColor) меняют цвет только тогда, когда поле сфокусировано.

Я думаю, что могу что-то сделать с focusListener, но я думаю, что это не очень хороший способ. Как я могу сделать это правильно?

ТекстИнпутРедактироватьТекст:

        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/edit_email"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textEmailAddress" />
    </com.google.android.material.textfield.TextInputLayout>

comment
проверьте этот stackoverflow.com/a/55357435/7666442   -  person AskNilesh    schedule 01.04.2019
comment
Нет, я хочу динамически изменить цвет границы TextInputLayout. Для текущего примера, если isValidEmail() возвращает true, я хочу один цвет в нефокусированном режиме, если false — другой. Я не могу сделать это со стилями.   -  person KirstenLy    schedule 01.04.2019


Ответы (1)


Вы можете использовать метод textInputLayout.setBoxStrokeColor(..).

Что-то типа:

if isValid(){
    textInputLayout.setBoxStrokeColor(...);
} else {
    textInputLayout.setBoxStrokeColor(...);
}

Вы можете использовать селектор, чтобы получить другой цвет, когда он не сфокусирован.
Что-то вроде:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:color="?attr/colorPrimary" android:state_focused="true"/>
  <item android:alpha="0.87" android:color="?attr/colorOnSurface" android:state_hovered="true"/>
  <item android:alpha="0.12" android:color="?attr/colorOnSurface" android:state_enabled="false"/>
  <item android:alpha="0.38" android:color="?attr/colorOnSurface"/>
</selector>
person Gabriele Mariotti    schedule 11.09.2019