Программно изменить цвет блока контура TextInputLayout

Я хотел бы программно изменить структуру TextInputLayout, но не могу заставить его работать. Есть возможность сделать это через XML (вопрос другого пользователя SO с использованием XML), но для меня это непригодно, так как мне нужна динамическая окраска. В настоящее время у меня есть следующий макет:

<com.google.android.material.textfield.TextInputLayout
    style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
    android:id="@+id/color_outline"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <com.google.android.material.textfield.TextInputEditText
        android:id="@+id/color"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Choose color"/>

</com.google.android.material.textfield.TextInputLayout>

Я попытался применить цвет, просмотрев различные методы окна TextInputLayout, но это не дало никакого эффекта.

internal fun String.toIntColor() = Integer.parseInt(this.replaceFirst("#", ""), 16)


val colorOutline: TextInputLayout = view.findViewById(R.id.color_outline)
colorOutline.boxStrokeColor = "#006699".toIntColor()

Как я могу раскрасить его динамически, как на картинке ниже?

Текущая ситуация:
введите здесь описание изображения

Желаемая ситуация: (фотошоп)
введите здесь описание изображения

Похожий вопрос, но с упором на XML




Ответы (1)


Вы можете использовать метод setBoxStrokeColorStateList.

Что-то типа:

//Color from rgb
int color = Color.rgb(255,0,0);
//Color from hex string
int color2 = Color.parseColor("#FF11AA");

int[][] states = new int[][] {
        new int[] { android.R.attr.state_focused}, // focused
        new int[] { android.R.attr.state_hovered}, // hovered
        new int[] { android.R.attr.state_enabled}, // enabled
        new int[] { }  // 
    };

    int[] colors = new int[] {
        color,
        color,
        color,
        color2
    };

    ColorStateList myColorList = new ColorStateList(states, colors);
    textInputLayout.setBoxStrokeColorStateList(myColorList);

введите описание изображения здесь

person Gabriele Mariotti    schedule 11.11.2019
comment
Кажется, это действительно было добавлено недавно, спасибо за быстрое уведомление. Отмечу как ответ :) - person Jason; 12.11.2019