You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

集成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:45:35