android - 如何从当前选定的主应用程序主题设置 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
文本外观?
解决方案
要将自定义芯片文本外观链接到基本应用程序主题或子主题,您可以在主题中使用“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"/>
推荐阅读
- python - 如何停止树莓派机器人汽车上的模糊图像?
- python - 在不同设备上进行程序间通信的最简洁方法
- javascript - 显示 alert() 点击,相对于 .clone() 之后的 Id
- javascript - 如何从VueJS中的另一个输入更改输入值
- javascript - 限制 javascript 中并发异步 xhr 请求的数量 - 避免 net::ERR_INSUFFICIENT_RESOURCES
- python - python中的多线程?
- python - 将对象解压成 int
- javascript - 井字游戏 js 没有响应
- javascript - 悬停时文件夹中的随机光标图像
- node.js - 如何在超级代理中发送有效负载