В Android существуют стили и темы которые позволяют структурировать разработку пользовательского интерфейса.
Они состоят из атрибутов которые определяют дизайн элементов. Атрибуты можно создавать или уже использовать существующие. Атрибутам можно присвоить значение, тип которого указывается при его создании.
Пример объявления атрибута из Android SDK:
<attr name="background" format="reference|color" />
Примечание:
Ссылка на другой атрибут через @[package:]type/name
структуру тоже является типом.
Темы vs стили
Темы и стили очень похожи, но используются для разных целей.
Стиль объединяет атрибуты для конкретного виджета. Извлекая атрибуты в стили, их можно легко использовать и поддерживать в нескольких виджетах одновременно.
Тема, в свою очередь, определяет набор атрибутов на которые можно ссылаться в приложении.
Стили и темы предназначены для совместной работы.
Например, у нас есть стиль, в котором фон кнопки — colorPrimary
, а цвет текста — colorSecondary
. Фактические значения этих цветов приведены в теме.
<?xml version="1.0" encoding="utf-8" ?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="LightTheme" parent="YourAppTheme"> <item name="colorPrimary">#FFFFFF</item> <item name="colorSecondary">#000000</item> </style> <style name="DarkTheme" parent="YourAppTheme"> <item name="colorPrimary">#000000</item> <item name="colorSecondary">#FFFFFF</item> </style> <style name="Button.Primary" parent="Widget.MaterialComponents.Button"> <item name="android:background">?attr/colorPrimary</item> <item name="android:textColor">?attr/colorSecondary</item> </style> </resources>
Когда устройство переходит в ночной режим, приложение может переключаться со своей «светлой» темы на «темную», изменяя значения этих ресурсов.
Нет необходимости менять стили, так как стили используют семантические имена, а не конкретные цветовые ресуры.
Виды ссылок в XML
Атрибут android:background
может принимать несколько типов:
android:background="@color/colorPrimary" android:background="?attr/colorPrimary"
В случае с @color/colorPrimary
— мы cсылаемся на цветовой ресурс colorPrimary
, а точнее на <color name="colorPrimary">#FFFFFF<color>
строку, которая прописана в res/values/color.xml
файле.
Примечание:
Цвет — это ресурс, на который ссылаются используя значение, указанное в атрибуте «name», а не имя XML-файла. Таким образом, можно комбинировать цветовые ресурсы с другими ресурсами в XML-файле под одним элементом <resources>
, но я этого не рекомендую.
В свою очередь, ?attr
— это ссылка на аттрибут темы.
?attr/colorPrimary
указывает на colorPrimary
атрибут, который находится в текущей теме:
<?xml version="1.0" encoding="utf-8" ?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="YourAppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">@color/colorPrimary</item> </style> </resources>
Преимущество ?attr
ссылок в том, что они будут меняться в зависимости от выбранной темы.
Использование атрибутов темы позволяет создавать меньше стилей, изолируя изменения внутри темы.
Всегда старайтесь ссылаться на цветовые ресурсы через атрибуты темы
Даже, если вы сейчас не поддерживаете несколько тем, то я бы всё равно рекомендовал следовать этому подходу, поскольку он значительно упростит дальнейшую работу с темами и стилями.
Структура ссылок
@[package:]type/name
-
package
— (опционально) название пакета в котором находиться ресурс. По умолчанию — это пакет приложения, в котором находится ресурс. -
type
— может быть одним изcolor
,string
,dimen
,layout
или какого-либо другого типа ресурса. Более подробно читайте здесь. -
name
— имя ресурса, используется как идентификатор ресурса.
?[package:]type/name
-
package
— (опционально) название пакета в котором находиться ресурс. По умолчанию — это пакет приложения, в котором находится ресурс. -
type
— (опционально) всегдаattr
когда используем?
. -
name
— имя ресурса, используется как идентификатор ресурса.
? vs ?attr vs ?android:attr
Возможно, вы замечали, что к некоторым атрибутам можно обратиться как ?android:attr/colorPrimary
, так и ?attr/colorPrimary
, а также ?colorPrimary
.
Это связано с тем, что некоторые атрибуты определены в Android SDK, и поэтому нужно указывать приставку android
, чтобы ссылаться на них.
Мы можем использовать ?
и ?attr
в случае, когда эти атрибуты находятся в библиотеках(Например, в AppCompat или MaterialDesign), которые компилируюся в приложение, поэтому пространство имен не требуется.
Некоторые элементы определены и в Android SDK, и в библиотеке, например colorPrimary
.
В таких случаях лучше использовать версию из библиотеки, поскольку она имеет поддержку на всех уровнях API.
Полезные ссылки
Ниже список с интересными статьями о стилях и темах от Google Android разработчиков:
Рекомендую ещё к просмотру видео с Android Dev Summit
2019 года. Ссылка на видео
ссылка на оригинал статьи https://habr.com/ru/post/543460/
Добавить комментарий