Подтвердить что ты не робот

Программно заданный цвет текста и цвет плавающей метки TextInputLayout

Я использую TextInputLayout, я бы хотел программно установить цвет текста подсказки и цвет плавающей метки, если поле ввода является обязательным. Перед перемещением в TextInputLayout я использовал программный цвет подсказки, используя следующие

textField.setHintTextColor(Color.RED);

Может ли кто-нибудь помочь мне настроить цвет текста подсказки и цвет плавающей метки программно для TextInputLayout.

В прикрепленном скриншоте я бы хотел, чтобы текст подсказки Адрес 1 был красным, если он не сфокусирован, а на фокусе плавающая метка Адрес 1 должна быть красной.

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

4b9b3361

Ответ 1

Я смог получить FloatingLabel в красном, используя следующие

textInputLayout.setErrorEnabled(true);
textInputLayout.setError(" ");

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

Ответ 2

Я изменил сфокусированный цвет с отражением. Здесь фрагмент может помочь кому-то.

private void setUpperHintColor(int color) {
    try {
        Field field = textInputLayout.getClass().getDeclaredField("mFocusedTextColor");
        field.setAccessible(true);
        int[][] states = new int[][]{
                new int[]{}
        };
        int[] colors = new int[]{
                color
        };
        ColorStateList myList = new ColorStateList(states, colors);
        field.set(textInputLayout, myList);

        Method method = textInputLayout.getClass().getDeclaredMethod("updateLabelState", boolean.class);
        method.setAccessible(true);
        method.invoke(textInputLayout, true);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

РЕДАКТИРОВАТЬ 2018-08-01:

Если вы используете библиотеку дизайна v28.0.0 и более поздних версий, поля изменились с mDefaultTextColor на defaultHintTextColor и с mFocusedTextColor на focusedTextColor.

Проверьте декомпилированный класс для других полей.

Ответ 3

Пожалуйста, внимательно ознакомьтесь с документацией здесь: Методы TextInputLayout

Есть метод:

setHintTextAppearance(int resId)

Который принимает идентификатор ресурса, который может быть цветным ресурсом!

Я хотел бы попробовать это и посмотреть, как это идет!

Я надеюсь, что это поможет вам!

Ответ 4

Обычно текст текста подсказки TextInputLayout поступает из приложения colorAccent.

Но если вы хотите изменить, вы можете использовать стиль для этого.

<android.support.design.widget.TextInputLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:theme="@style/TextLabel">
 </android.support.design.widget.TextInputLayout>

@style

<style name="TextLabel" parent="TextAppearance.AppCompat">
    <!-- Hint color and label color in FALSE state -->
    <item name="android:textColorHint">@color/Color Name</item> 
    <item name="android:textSize">20sp</item>
    <!-- Label color in TRUE state and bar color FALSE and TRUE State -->
    <item name="colorAccent">@color/Color Name</item>
    <item name="colorControlNormal">@color/Color Name</item>
    <item name="colorControlActivated">@color/Color Name</item>
 </style>

Но если вы хотите добавить красный цвет, то как вы можете отличить цвет ошибки, означает, что базовая стандартная ошибка имеет красный цвет.

textField.setHintTextColor(Color.RED); Может ли кто-нибудь помочь мне задайте цвет текста подсказки и цвет плавающей метки для TextInputLayout.

setHintTextColor работает для API 23 +

Ответ 5

Для изменения как Focused Color, так и Default Text Color для макета TextInput

private void setInputTextLayoutColor(int color, TextInputLayout textInputLayout) {
    try {
        Field field = textInputLayout.getClass().getDeclaredField("mFocusedTextColor");
        field.setAccessible(true);
        int[][] states = new int[][]{
                new int[]{}
        };
        int[] colors = new int[]{
                color
        };
        ColorStateList myList = new ColorStateList(states, colors);
        field.set(textInputLayout, myList);

        Field fDefaultTextColor = TextInputLayout.class.getDeclaredField("mDefaultTextColor");
        fDefaultTextColor.setAccessible(true);
        fDefaultTextColor.set(textInputLayout, myList);

        Method method = textInputLayout.getClass().getDeclaredMethod("updateLabelState", boolean.class);
        method.setAccessible(true);
        method.invoke(textInputLayout, true);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

EDIT: Изменить цвет линии AppCompactEditText

Вам нужно установить backgroundTintList (или supportBackgroundTintList) на EditText в экземпляр ColorStateList, содержащий только цвет, который вы хотите изменить. Простой способ сделать это с обратной совместимостью выглядит следующим образом:

ColorStateList colorStateList = ColorStateList.valueOf(color)
editText.setSupportBackgroundTintList(colorStateList)

Это даст EditText желаемый цвет подчеркивания.

Ответ 6

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

Я рад поделиться ответом на этот вопрос с небольшой детализацией.

Все, что нам нужно знать, это:

  1. Добавление строки ниже к стилю TextInputLayout или его дочернего виджета не очень помогает.

    <item name = "android: textColorHint"> @color/white </item>

    так как он будет использовать colorAccent всякий раз, когда фокус получен/предоставлен редактируемому виджету.

  2. Фактический ответ на эту проблему состоит в том, чтобы добавить эту линию стиля в тег стиля приложения, с помощью которой он будет устанавливать цвет подсказки, когда эта или любая редактируемая область не находится в фокусе. (Это то, что мы пропускаем каждый раз).

Пожалуйста, дайте мне знать, если у нас есть другая информация по этому вопросу.

Спасибо!

Ответ 7

Я долго искал решение. Но наконец нашел это! Получилось слишком просто)

Котлин версия:

private fun setTextInputLayoutHintColor(textInputLayout: TextInputLayout, context: Context, @ColorRes colorIdRes: Int) {
    textInputLayout.defaultHintTextColor = ColorStateList.valueOf(ContextCompat.getColor(context, colorIdRes))
}

и наконец:

setTextInputLayoutHintColor(textInputLayout, context, R.color.errorColor)

Ответ 8

С библиотекой компонентов материалов вы можете использовать:

В макете:

<com.google.android.material.textfield.TextInputLayout
    app:hintTextColor="@color/mycolor"
    android:textColorHint="@color/text_input_hint_selector"
    .../>

в стиле:

<style name="..." parent="Widget.MaterialComponents.TextInputLayout.FilledBox">
    <!-- The color of the label when it is collapsed and the text field is active -->
    <item name="hintTextColor">?attr/colorPrimary</item>
    <!-- The color of the label in all other text field states (such as resting and disabled) -->
    <item name="android:textColorHint">@color/mtrl_indicator_text_color</item>
</style>

в коде:

// Sets the text color used by the hint in both the collapsed and expanded states
textInputLayout.setDefaultHintTextColor(...);

//Sets the collapsed hint text color
textInputLayout.setHintTextColor(....);