Я следую руководству Material Design о том, как выполнять цветовую заливку. Мы можем изменить некоторые атрибуты, которые уже определены, чтобы настроить цвет и / или форму определенного компонента. Некоторые полезные атрибуты, которые имеют отношение к цвету, включают: colorSurface
(например, изменяет цвет заливки компонента Material Card
), colorSecondary
(например, изменяет цвет заливки FAB) и colorOnSecondary
(например, изменяет заливку цвет значка FAB).
В настоящее время у меня есть два каталога ресурсов: values
и values-night
для пользовательского интерфейса со светлой и темной тематикой соответственно. Они контролируют значение цветов, которые назначены атрибутам цвета. Коды:
<!-- Light-themed UI color values -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#546e7a</color>
<color name="colorPrimaryVariant">#29434e</color>
<color name="colorOnPrimary">#ffffff</color>
<color name="colorSecondary">#d81b60</color>
<color name="colorSecondaryVariant">#a00037</color>
<color name="colorOnSecondary">#000000</color>
<color name="colorSurface">#ffffff</color>
</resources>
<!-- Dark-themed UI color values -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#546e7a</color>
<color name="colorPrimaryVariant">#29434e</color>
<color name="colorOnPrimary">#ffffff</color>
<color name="colorSecondary">#d81b60</color>
<color name="colorSecondaryVariant">#a00037</color>
<color name="colorOnSecondary">#000000</color>
<color name="colorSurface">#000000</color>
</resources>
<!-- Style resource file that changes in accordance to current default night mode -->
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryVariant</item>
<item name="colorOnPrimary">@color/colorOnPrimary</item>
<item name="colorSecondary">@color/colorSecondary</item>
<item name="colorOnSecondary">@color/colorOnSecondary</item>
<item name="colorSurface">@color/colorSurface</item>
<item name="colorOnSurface">@color/colorOnSurface</item>
</style>
Текст на некоторых компонентах (например, кнопках) зависит от colorOnPrimary
. Когда компоненты используют colorPrimary
и colorOnPrimary
, я могу хорошо контролировать используемые цвета. Однако цвет компонентов, такой как Material TextView
, не зависит от colorOnSurface
и может быть изменен с помощью специальных атрибутов , таких как textAppearanceHeadline1
. Конечно, я могу просто изменить android:textColor
на textAppearanceHeadline1
, чтобы он соответствовал цвету colorOnSurface
. Тем не менее, Material TextView
иногда появляется на фоне (не поверхностях), и когда это происходит, я хочу, чтобы android:textColor
вместо этого имел значение colorOnBackground
.
Возможно, я просто смогу применить стиль с colorOnSurface
to all Material TextView
и переопределяет стиль только с colorOnBackground
, когда Material TextView
появляется на фоне. Однако есть ли способ, которым я могу автоматически изменить значение, используемое android:textColor
, в зависимости от того, где появляется текст?