首页 > 解决方案 > 如何从当前选定的主应用程序主题设置 Android 芯片文本外观

问题描述

我一直在研究在我当前的 Android 项目中动态更改我的 Android 应用程序主题。

我定义了一个基本主题,然后创建了多个子主题,它们只是使用不同的字体。

这一切都很好,并且符合 TextViews 的预期。

<style name="Theme.MyBaseTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    <item name="android:windowAnimationStyle">@style/WindowAnimations</item>
    <item name="colorPrimary">@color/primaryColor</item>
    <item name="colorPrimaryVariant">@color/primaryVariantColor</item>
    <item name="colorSecondary">@color/secondaryColor</item>
    <item name="colorSecondaryVariant">@color/secondaryVariantColor</item>
    <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
    <item name="android:textAppearanceLarge">@style/TextAppearance.Literal</item>
    <item name="android:fontFamily">@font/roboto_regular</item>
    <item name="fontFamily">@font/roboto_regular</item>
</style>

<style name="Theme.MyBaseTheme.Readable" parent="Theme.MyBaseTheme">
    <item name="android:fontFamily">@font/lexie_readable_regular</item>
    <item name="fontFamily">@font/lexie_readable_regular</item>
</style>

<style name="Theme.MyBaseTheme.Dyslexic" parent="Theme.MyBaseTheme">
    <item name="android:fontFamily">@font/open_dyslexic_regular</item>
    <item name="fontFamily">@font/open_dyslexic_regular</item>
</style>

<style name="Theme.MyBaseTheme.Mono" parent="Theme.MyBaseTheme">
    <item name="android:fontFamily">@font/b612_mono_regular</item>
    <item name="fontFamily">@font/b612_mono_regular</item>
</style>

我对 . 中显示的文本有疑问com.google.android.material.chip.Chip

Chip文本外观不会改变。

Chip我可以使用定义如下的自定义主题更改主题

<style name="ChipTextAppearance" parent="TextAppearance.MaterialComponents.Chip">
  <item name="fontFamily">@font/roboto_mono</item>
  <item name="android:fontFamily">@font/roboto_mono</item>
</style>

但是,我看不到如何将自定义芯片主题链接到我的 App 主题,以便当我动态切换 App 主题时,Chip文本外观也会更改以使用正确的字体。

我需要做什么来动态切换我的 App 主题和我的Chip文本外观?

标签: androidandroid-theme

解决方案


要将自定义芯片文本外观链接到基本应用程序主题或子主题,您可以在主题中使用“chipStyle”属性。

将您的基本应用主题的结构更改为如下所示:

    <!-- Base application theme. -->
    <style name="Theme.MyBaseTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
     <item name="colorPrimary">@color/primaryColor</item>
     <item name="android:fontFamily">@font/roboto_regular</item>
     <item name="fontFamily">@font/roboto_regular</item>
     <item name="chipStyle">@style/ChipStyle.Base</item>
    </style>

    <style name="ChipStyle.Base" parent="@style/Widget.MaterialComponents.Chip.Action">
        <item name="android:textAppearance">@style/ChipTextAppearance.Base</item>
        <item name="chipBackgroundColor">@android:color/holo_blue_light</item>
    </style>

    <style name="ChipTextAppearance.Base" parent="TextAppearance.MaterialComponents.Chip">
        <item name="fontFamily">@font/roboto_regular</item>
        <item name="android:fontFamily">@font/roboto_regular</item>
    </style>

您的子主题可读(模式)示例如下:

   <!-- Sub theme Readable -->
    <style name="Theme.MyBaseTheme.Readable" parent="Theme.MyBaseTheme">
        <item name="android:fontFamily">@font/lexie_readable_regular</item>
        <item name="fontFamily">@font/lexie_readable_regular</item>
        <item name="chipStyle">@style/ChipStyle.Readable</item>
    </style>

    <style name="ChipStyle.Readable" parent="@style/Widget.MaterialComponents.Chip.Action">
        <item name="android:textAppearance">@style/ChipTextAppearance.Readable</item>
        <item name="chipBackgroundColor">@android:color/holo_orange_dark</item>
    </style>

    <style name="ChipTextAppearance.Readable" parent="TextAppearance.MaterialComponents.Chip">
        <item name="fontFamily">@font/lexie_readable_regular</item>
        <item name="android:fontFamily">@font/lexie_readable_regular</item>
    </style>

您可以在您的芯片中使用上述主题,如下所示:

<com.google.android.material.chip.Chip
    android:theme="@style/Theme.MyBaseTheme.Readable"
    android:id="@+id/chip"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Chip"/>

推荐阅读