Почему EditText принимает только тему? - PullRequest
0 голосов
/ 07 сентября 2018

Я пытался применить style к EditText, чтобы изменить его colorAccent, я пытался установить его style и android:textAppearance, но он полностью игнорировал мои новые настройки.Единственный способ заставить его работать, это установить android:theme.

Я что-то не так делаю или это ожидаемое поведение?Зачем?

Мой стиль:

<style name="bright_color_cursor" parent="AppTheme">
    <item name="colorAccent">@color/primaryBrightColor</item>
    <item name="android:textColorHighlight">@color/primaryBrightColor</item>
</style>

Мой EditText:

<EditText
    android:id="@+id/edit_text"
    android:theme="@style/bright_color_cursor"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:layout_marginBottom="16dp"
    android:background="@android:color/transparent"
    android:ems="10"
    android:hint="@string/hello"
    android:inputType="textCapWords"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="@+id/name_edit_text"
    app:layout_constraintTop_toBottomOf="@+id/divider" />

Изменение android:theme на любой из этих параметров не будет работать:

style="@style/bright_color_cursor"

или

android:textAppearance="@style/bright_color_cursor"

1 Ответ

0 голосов
/ 07 сентября 2018

Да, такое поведение следует ожидать с EditText. Нам нужно стилизовать его, используя свойство android:theme.

При использовании @style EditText не использует значения, которые мы установили (и поэтому стиль кажется игнорируемым). Это потому, что EditText создает некоторые дочерние представления, которые не стилизуются. Смотрите мое подробное объяснение ниже.


Подробное объяснение и причина

1) Во-первых, значения опробованных опций и что они делают:

  • style: (Примечание: без префикса android:): это устанавливает стили только для самого компонента и не изменяет стили его дочерних представлений /layouts.
  • android:theme: в основном это относится к стилю к себе и применяет стиль к его дочерним элементам представлениям / макетам.
  • android:textAppearance: этот код ведет себя так же, как @style для стиля.

2) Функциональность EditText

Как мы можем себе представить: EditText - это не просто представление. Он имеет фоновый рисунок и обрабатывает взаимодействие и тому подобное. Для работы этой функции просто необходимы некоторые дополнительные представления (и логика).

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

3) Вернуться к теме

Подвиды, которые EditText добавляет для своей функциональности, оформляются так же, как и другие представления. Это означает, что дочерние представления наследуют стиль только тогда, когда мы используем свойство android:theme. Потому что это свойство заставляет его стилизовать и дочерние представления.

И, если мы используем @style в тексте редактирования, дети не получат этот стиль.

4) Почему это происходит (только) для EditText?

Ну, не совсем только ... Базовый вид EditText - это TextView, но TextView не обеспечивает функциональность, необходимую для EditText. Таким образом, EditText сам добавляет дополнительные функции.

Например,

A Button имеет TextView в качестве базы. Но у этого класса достаточно представлений с текстом и фоном, которые он получает от базового класса, и поэтому Button не нужно добавлять дополнительные представления для его функциональности. Таким образом, использование @style работает, так как не создает дочерних представлений для стиля.

Сказав это, небольшое замечание: Фактически, в источнике TextView фактически содержит логику редактирования, но в случае Button он просто не выполняет эту часть кода. (Для кнопки не требуется функциональность Editting, поэтому она не выполняется)

...