Xamarin.Forms安卓闪屏页白色背景显示为灰色问题求解
问题场景
- 运行环境:开启系统深色模式的安卓设备
- 异常表现:自行开发的Xamarin.Forms应用闪屏页已配置白色背景,实际运行时显示灰色背景,疑似与系统深色模式逻辑相关
- 相关配置:
- 闪屏页drawable文件
splash_screen.xml:
- 闪屏页drawable文件
<?xml version="1.0" encoding="utf-8" ?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <color android:color="@color/launcher_background"/> </item> <item> <bitmap android:src="@drawable/logo1_100x153" android:tileMode="disabled" android:gravity="center"/> </item> </layer-list>
- 主题样式文件
styles.xml:
<?xml version="1.0" encoding="utf-8" ?> <resources> <style name="MainTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Xamarin.Forms 4.6+ 主题内置到Forms程序集,可在此处覆盖自定义配置 --> <!-- colorPrimary 用于默认ActionBar背景 --> <!--<item name="colorPrimary">#2196F3</item>--> <!-- colorPrimaryDark 用于状态栏颜色 --> <item name="colorPrimaryDark">#000000</item> <item name="android:forceDarkAllowed">false</item> <!-- colorAccent 用于控件激活态的默认着色 --> <!--<item name="colorAccent">#FF4081</item>--> </style> <style name="MyTheme.Splash" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowBackground">@drawable/splash_screen</item> <item name="android:windowNoTitle">true</item> <item name="android:windowFullscreen">true</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowActionBar">true</item> </style> </resources>
- 实际运行效果:

问题根因
该异常由安卓深色模式的两个生效规则共同导致:
- 闪屏主题遗漏强制深色禁用配置:
android:forceDarkAllowed属性是按主题维度独立生效的,你仅在主主题MainTheme中配置了false阻止系统自动转暗色,但闪屏页使用的独立主题MyTheme.Splash未添加该配置。安卓10及以上版本开启深色模式时,会对未显式关闭该属性的Light主题自动做暗色转换,将原本的白色背景转为适配深色模式的灰色调。 - 颜色资源存在夜间模式专属配置:代码中引用的
@color/launcher_background是Xamarin.Android默认模板生成的颜色资源,默认在Resources/values-night/colors.xml路径下存在深色模式专属配置,色值为灰色。系统开启深色模式时会优先加载values-night目录下的资源,直接覆盖普通values目录下的白色配置。
修复方案
按以下步骤调整配置即可固定闪屏页白色背景,不受系统深色模式影响:
- 为闪屏主题补充强制深色禁用配置
在MyTheme.Splash样式节点下新增android:forceDarkAllowed属性,和主主题配置保持一致,修复后代码如下:
<style name="MyTheme.Splash" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowBackground">@drawable/splash_screen</item> <item name="android:windowNoTitle">true</item> <item name="android:windowFullscreen">true</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowActionBar">true</item> <!-- 禁用系统强制暗色转换 --> <item name="android:forceDarkAllowed">false</item> </style>
- 统一背景色值,避免夜间资源覆盖
两种实现方式二选一即可:
- 方式一:打开项目下
Resources/values/colors.xml和Resources/values-night/colors.xml两个文件,将其中launcher_background的色值统一修改为#FFFFFF; - 方式二:直接修改
splash_screen.xml,将背景色硬编码为白色,跳过颜色资源引用,修改后对应节点代码为:
<item> <color android:color="#FFFFFF"/> </item>
- 校验清单文件配置
确认AndroidManifest.xml中闪屏对应的Activity配置的主题为MyTheme.Splash,未被全局Application主题覆盖。
内容的提问来源于stack exchange,提问作者user18972374
相关产品推荐
相关产品推荐

