Позволяет определить внешний вид View
<TextView style="@style/header"/>
<TextView style="@style/regular"/>
И избежать дублирование кода
Выносите стили!
Q: Как раскрасить кнопку?
- ?style
- ?style
значения по-умолчанию
<ripple android:color="?attr/colorControlHighlight">
<item>
<nine-patch
android:src="@drawable/btn_mtrl_alpha"
android:tint="?attr/colorButtonNormal">
</nine-patch>
</item>
</ripple>
<style name="Implicit">
<item name="android:textSize">60dp</item>
</style>
<style name="Explicit">
<item name="android:textColor">@color/red</item>
</style>
<style name="Implicit.LargeTransparent">
<item name="android:alpha">0.5</item>
</style>
<style name="Implicit.LargeTransparentRed" parent="Explicit">
<item name="android:alpha">0.5</item>
</style>
LargeTransparent
LargeTransparentRed
TransparentRed
При написании приложения мы должны всегда использовать ссылки ?attr/resource, а не прямые указания @color/black
Стили, селекторы и другие drawable должны ссылаться на атрибуты темы
colorButtonNormal - это селектор
редкие
Их еще много...
Зависимые по-умолчанию от colorAccent
На самом деле colorControlHighlight не зависит от accent - это прозрачный черный #1f000000, поэтому его не видно на черных элементах
<style name="AppThemeOverlay.Colorful" parent="ThemeOverlay.AppCompat">
<item name="colorControlNormal">?colorAccent</item>
</style>
<style name="AppThemeOverlay.Desaturated" parent="ThemeOverlay.AppCompat">
<item name="colorControlActivated">?android:textColorTertiary<item>
</style>
Q: Как это работает?
Посмотрим как работает View
LayoutInflater
складывает стиль в AttributeSet
AttributeSet
извлекаются через контекстContextThemeWrapper
Обратно по дереву собираются темы
Тему лучше всего назначать на глобальные сущности - Application, Activity, Fragment
Overlay подходит для ViewGroup - Toolbar, AlertDialog
, а возможно и для вашего блока с формой
<LinearLayout
android:theme="@style/AppThemeOverlay.Colorful">
</LinearLayout>
Стили применяются для конечного элемента View, а их параметры резолвятся относительно темы
Возможны ситуации, когда на 1 вьюшке будет и тема и стиль
Как правилоView
резолвит значения 1 раз, в момент создания.
Чтобы изменить тему - необходимо пересоздатьView
.
у Activity
можно позвать метод recreate()
Позволяют добавлять собственные атрибуты
attrs.xml лучше подходят для семантики вашей предметной области, чем colors.xml
attrs.xml
<declare-styleable name="Base.AppTheme">
<attr name="colorPrimaryLight" format="color|reference" />
<attr name="textColorDisabledDefault" format="color|reference" />
<attr name="ohmyButtonColorNormal" format="color|reference"/>
<attr name="ohmyButtonColorDisabled" format="color|reference" />
</declare-styleable>
Дополнительные цвета
<style name="AppTheme.Light.Green">
<item name="colorPrimaryLight">@color/green_light</item>
<item name="colorPrimary">@color/green</item>
<item name="colorPrimaryDark">@color/green_dark</item>
<item name="colorAccent">@color/red_light</item>
<item name="colorControlActivated">@color/red</item>
</style>
<style name="AppTheme.Dark.Green">
<item name="colorPrimaryLight">@color/green_light</item>
<item name="colorPrimary">@color/green</item>
<item name="colorPrimaryDark">@color/green_dark</item>
<item name="colorAccent">@color/red_light</item>
<item name="colorControlActivated">@color/red</item>
</style>
Когда-нибудь опубилкую в виде библиотеки