集成Android Splash Screen API后DayNight主题切换无法即时生效问题
解决Splash Screen API集成后DayNight主题无法即时切换的问题
问题核心
集成androidx.core:core-splashscreen:1.0.0-rc01后,系统切换昼夜主题时,应用主题无法即时生效,必须重启应用——本质是闪屏主题的静态配置导致系统主题变更后,Activity未正确触发主题重加载。
解决方案
1. 让Activity正确响应系统主题变更
如果你的Activity在AndroidManifest.xml中声明了android:configChanges="uiMode"(避免系统重启Activity),需在onConfigurationChanged中手动更新主题并刷新界面:
override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) // 重新应用DayNight主题 setTheme(R.style.Theme_Shelf) // 重建界面以生效主题变更 recreate() }
若未声明configChanges="uiMode",系统会自动重启Activity,此时只需确保Theme.Shelf(闪屏后主题)继承自DayNight类型即可(你的配置已满足)。
2. 适配闪屏界面的昼夜主题(可选)
如果希望闪屏界面也跟随系统主题变化,需将闪屏主题中的资源替换为DayNight适配版本:
- 在
values/colors.xml和values-night/colors.xml中分别定义splash_background,替换原windowSplashScreenBackground的@color/white_back_color - 为
windowSplashScreenAnimatedIcon提供日间/夜间两种动画资源,通过drawable-night文件夹放置夜间版本
3. 启动时动态绑定闪屏后主题(可选)
若需在应用启动时根据当前系统主题精准指定闪屏后的主题,可在installSplashScreen()前动态修改闪屏主题属性:
override fun onCreate(savedInstanceState: Bundle?) { // 根据当前系统夜间模式设置对应的主题 val currentTheme = if (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES) { R.style.Theme_Shelf // 可替换为独立的夜间主题 } else { R.style.Theme_Shelf // 可替换为独立的日间主题 } // 修改闪屏主题的postSplashScreenTheme属性 val attrs = theme.obtainStyledAttributes(R.style.Theme_Splash) attrs.setValue(R.attr.postSplashScreenTheme, currentTheme) attrs.recycle() super.onCreate(savedInstanceState) installSplashScreen() setContentView(R.layout.activity_main) }
关键注意事项
- 确保所有布局、颜色、Drawable资源都已在
values-night/drawable-night等夜间文件夹中完成适配 - 避免在闪屏主题中硬编码固定的日间/夜间资源,保持资源的DayNight兼容性
内容的提问来源于stack exchange,提问作者Junaid Khan
相关产品推荐
相关产品推荐

