Цвет контура редактирования текста - PullRequest
1 голос
/ 30 января 2020

Я пытаюсь стилизовать TextInputLayout:

<style name="AppTheme.TextInputLayout.OutlinedBox" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox">
    <item name="boxStrokeColor">@color/text_input_layout_outlined_box_stroke</item>
    <item name="hintTextColor">@color/text_input_layout_outlined_box_stroke</item>
</style>

И это селектор цвета:

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

И это мой вид:

<com.google.android.material.textfield.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:hint="@string/surname">

    <com.google.android.material.textfield.TextInputEditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

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

Почему это работает должным образом применительно к представлению:

style="@style/AppTheme.TextInputLayout.OutlinedBox"

И тема не работает:

android:theme="@style/AppTheme.TextInputLayout.OutlinedBox"

Я не вижу различий между этими двумя ...

РЕДАКТИРОВАТЬ: возможно, я нашел это, чтобы избежать повторения для каждого представления:

<item name="textInputStyle">@style/AppTheme.TextInputLayout.OutlinedBox</item>

1 Ответ

1 голос
/ 30 января 2020

Вы можете определить стиль :

<style name="AppTheme.TextInputLayout.OutlinedBox" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox">
    <item name="boxStrokeColor">@color/text_input_layout_outlined_box_stroke</item>
    <item name="hintTextColor">@color/text_input_layout_outlined_box_stroke</item>
</style>

и применить его к представлению с помощью:

<com.google.android.material.textfield.TextInputLayout
   style="@style/AppTheme.TextInputLayout.OutlinedBox"
   ..>

В то же время вы можете определить:

  <style name="textInputPrimaryColor" parent="">
    <item name="colorPrimary">@color/.....</item>
  </style>

, а затем используйте его с атрибутом android:theme:

<com.google.android.material.textfield.TextInputLayout
   style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
   android:theme="@style/textInputPrimaryColor"
   ..>

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

Подробнее информация здесь .

Таким образом вы переопределяете атрибут colorPrimary в стиле Widget.MaterialComponents.TextInputLayout.OutlinedBox.

Например, это селектор по умолчанию, используемый boxStrokeColor.

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

Используя android:theme="@style/textInputPrimaryColor", вы можете изменить colorPrimary для этого представления без расширения стиля.

Вы можете добиться того же поведения, используя атрибут materialThemeOverlay в своем стиле:

  <style name="My.OutlinedBox" parent="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox">
    <item name="materialThemeOverlay">@style/ThemeOverlay.My.OutlinedBox</item>
  </style>

с:

  <style name="ThemeOverlay.My.OutlinedBox" parent="ThemeOverlay.MaterialComponents.TextInputEditText.OutlinedBox">
    <item name="colorPrimary">@color/......</item>
  </style>

и затем примените его к вашему виду:

<com.google.android.material.textfield.TextInputLayout
   style="@style/My.OutlinedBox"
   ..>

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

В настоящее время существует не является атрибутом для определения стиля только для TextInputLayout со стилем OutlinedBox.
Вы можете назначить глобальный стиль только для всех TextInputLayout представлений в вашем приложении, используя textInputStyle атрибут в теме вашего приложения:

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
   ...
   <item name="textInputStyle">@style/My.OutlinedBox</item>
</style>

Примечание: требуется версия 1.1.0 библиотеки компонентов материалов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...