Android夜间模式下Toolbar主题颜色固定为默认值问题咨询
问题成因
- 夜间主题父类配置错误:当前夜间主题的父类是
Theme.AppCompat.Light,属于亮色主题父类,深色模式下系统会自动覆写部分基础颜色属性,导致自定义配置不生效。 - 自定义属性
colorToolbar未正确定义:样式中多次引用?attr/colorToolbar,如果没有在res/values/attrs.xml中提前声明该自定义属性,系统会无法解析该值,自动降级使用Material Design深色主题默认的背景色#121212。 - ActionBar样式父类适配错误:配置的
Theme.MyApp.ActionBarNight父类是Widget.AppCompat.Light.ActionBar.Solid.Inverse,属于亮色主题下的反色ActionBar样式,和深色主题的属性适配存在冲突,会导致背景配置被覆盖。 - 冗余配置冲突:布局中没有引入自定义Toolbar,却配置了
toolbarStyle相关属性,不同属性优先级冲突会导致ActionBar样式被覆盖。
修复方案
- 声明自定义属性(若保留
colorToolbar引用需要这一步)
在res/values/attrs.xml中添加如下代码:
<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="colorToolbar" format="color|reference" /> </resources>
如果不想用自定义属性,可以直接把所有?attr/colorToolbar替换为直接的颜色值比如#006BD5,跳过这一步即可。
- 修改夜间主题的父类与基础配置
将night/themes.xml中的基础主题父类替换为深色主题对应父类,同时删掉冗余的Toolbar配置、显式开启ActionBar:
<resources xmlns:tools="http://schemas.android.com/tools"> <!-- Base application theme. --> <style name="Theme.MyApp" parent="Theme.AppCompat.Dark"> <item name="colorPrimary">#0069D3</item> <item name="colorPrimaryVariant">#0069D3</item> <item name="colorOnPrimary">#FFFFFF</item> <item name="colorOnSurface">#FFFFFF</item> <!-- Secondary brand color. --> <item name="colorSecondary">@color/teal_200</item> <item name="colorSecondaryVariant">@color/teal_200</item> <item name="colorOnSecondary">#FFFFFF</item> <!-- 显式开启ActionBar --> <item name="windowActionBar">true</item> <item name="windowNoTitle">false</item> <!-- Status bar color. --> <item name="android:statusBarColor">?attr/colorToolbar</item> <item name="actionBarStyle">@style/Theme.MyApp.ActionBarNight</item> </style> <style name="Theme.MyApp.PopupOverlay" parent="ThemeOverlay.AppCompat.Dark"> <item name="android:background">?attr/colorToolbar</item> </style> <style name="Theme.MyApp.ActionBarNight" parent="@style/Widget.AppCompat.ActionBar.Solid"> <item name="background">?attr/colorToolbar</item> <item name="android:background">?attr/colorToolbar</item> <item name="titleTextStyle">@style/MyActionBarTitle</item> </style> <style name="MyActionBarTitle" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"> <item name="android:textColor">@color/white</item> </style> </resources>
内容的提问来源于stack exchange,提问作者Giovanni
相关产品推荐
相关产品推荐

