Как изменить цвет плавающей метки TextInputLayout и курсора, не меняя `colorAccent` в `AppTheme`

Этот вопрос связан с двумя другими вопросами, которые я специально назову ниже. Разница в том, что я специально прошу способ изменить цвет без использования базы AppTheme.

В первом связанном вопросе предлагаемое решение включает установку

<item name="colorAccent">@color/Color Name</item> in AppTheme

Тем не менее, в нем также говорится о создании темы/стиля специально для TextInputLayout, которая выглядит следующим образом:

<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>

Таким образом, colorAccent устанавливается дважды. Я попробовал это и пришел к выводу, что конкретная тема для TextInputLayout не нужна, так как получил один и тот же результат, как с ней, так и без нее. Достаточно только установить colorAccent в AppTheme. Это работает, но не обязательно то, что я хочу/нужно.

Во втором связанном вопросе люди предлагают снова изменить AppTheme и установить colorAccent (и другие атрибуты).

Однако я не нахожу это решение правильным/удовлетворительным. Должен быть способ специально изменить этот один цвет, не меняя стиль всего приложения, что человек, задающий второй вопрос, также критикует в одном из своих комментариев.

Итак, то, что я специально ищу здесь, — это решение в XML или программно для конкретного изменения цвета плавающей подсказки/метки и курсора TextInputLabel+ TextInputEditText Комбо. В основном то же самое поведение, которое я получил бы при установке colorAccent.

Есть ли способ сделать это или разработчики SDK серьезно сделали это возможным, только установив colorAccent?

PS Я понимаю, что это может работать с созданием новой темы, наследующей от AppTheme и устанавливающей ее для действий, которые я хочу иметь определенного цвета. Однако, как я уже сказал, это не то, что я ищу.


person Benjamin Basmaci    schedule 25.06.2019    source источник


Ответы (3)


Создайте собственный стиль следующим образом:

    <style name="myInputText">
     <item name="android:textColor">@color/myColor</item>
     <item name="android:textSize">@dimen/text_size</item>
     ...
     </style>

Теперь вы можете напрямую использовать это в TextInputLayout, не нужно указывать родительский стиль или менять тему приложения.

<android.support.design.widget.TextInputLayout
    android:textColorHint="@color/myColor" 
    app:hintTextAppearance="@style/myInputText"
    android:layout_width="match_parent"
    android:layout_height="50dp">

ИЗМЕНИТЬ

Это меняет только цвет плавающей метки, а не курсора. Чтобы также изменить цвет курсора, вам нужно создать рисуемый объект:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <size android:height="10dp"
          android:width="2dp"/>
    <solid android:color="@color/myColor"/>
</shape>

и добавьте его к стилю, который вы используете для TextInputEditText, не для TextInputLayout.

<style name="Settings.TextInputEditText">
    ...
    <item name="android:textCursorDrawable">@drawable/cursor</item>
</style>
person Deˣ    schedule 25.06.2019
comment
Когда я пытаюсь установить android:hintTextAppearance в стиле, он вообще не может быть разрешен. Когда я устанавливаю только hintTextAppearance в стиле или непосредственно в TextInputLayout, текст теряет весь цвет и становится очень маленьким. Кроме того, установка textColorHint изменяет только цвет подсказки, а фокус не находится на TextInputEditText. Как только он получает фокус, плавающий текст снова становится стандартным зеленым цветом. - person Benjamin Basmaci; 25.06.2019
comment
Я отредактировал ответ. Я как-то запутался раньше. Дайте мне знать, если это не сработает. - person Deˣ; 25.06.2019

Вы можете попробовать установить colorAccent для нужных вам представлений, только... Что-то вроде:

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:theme="@style/AppThemeInputLayout" />

Затем в styles.xml

<style name="AppThemeInputLayout" parent="AppTheme">
    <item name="colorAccent">#FF0000</item>
</style>

Я думаю, таким образом вы можете изменить colorAccent только для определенных представлений (а не для всего приложения)

Дайте мне знать, если это сработает для вас. В противном случае я удалю этот ответ.

person W0rmH0le    schedule 25.06.2019
comment
Как я сказал в своем последнем предложении, я понимаю, что могу это сделать. Однако это очень неудовлетворительный обходной путь, а не прямой способ сделать это. Я ищу что-то вроде <item name="floatingLabelColor">#F00</item> - person Benjamin Basmaci; 25.06.2019

Измените цвет, который вы хотите, в разрешении / цвете - и ваш любимый цвет, как определить 3 цвета, вы можете изменить эффект

person axar    schedule 25.06.2019
comment
Извините, но я действительно не понимаю, что вы пытаетесь сказать - person Benjamin Basmaci; 25.06.2019
comment
открыть цвет и изменить цвет для просмотра эффекта - prntscr.com/o8wx91 - person axar; 01.07.2019
comment
Я понимаю что ты имеешь ввиду. Однако в своем вопросе я специально сказал, что это не так, как я хочу. Спасибо за попытку. - person Benjamin Basmaci; 01.07.2019