Да, такое поведение следует ожидать с 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
, поэтому она не выполняется)