Измените цвет текста Material TextView на поверхности и на фоне с помощью темы. - PullRequest
0 голосов
/ 03 февраля 2020

Я следую руководству 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, в зависимости от того, где появляется текст?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...