Compose纯应用完整深色主题实现的正确方式及相关疑问
Compose纯应用主题切换与导航栏颜色问题及疑问
我开发了一款Compose纯应用,提供三种主题选项:System、Light、Dark。在Activity的onCreate()方法中,通过向自定义主题Composable函数传入darkTheme参数切换主题。
当选择System且系统支持Dark mode(Android 10+)时一切正常,但选择Dark时,Compose深色主题生效,底部系统导航栏却保持白色。查看res/values/themes.xml,发现其使用android:Theme.Material.Light.NoActionBar作为父主题,推测是该默认主题导致无法从Compose控制导航栏颜色。
对于Android 10+设备,用户可选择System并手动切换系统深色模式,但不支持该功能的设备中,白色导航栏体验极差。
已尝试的解决方法
我通过以下方法解决了问题:
- 将
styles.xml的父主题改为Theme.AppCompat.DayNight; - 将Activity从
ComponentActivity改为AppCompatActivity; - 使用对应API切换夜间模式:
// For SDK <= 30 AppCompatDelegate.setDefaultNightMode() // For SDK >= 31 uiManager.setApplicationNightMode()
疑问
但存在三个疑问:
- Compose纯应用使用
Theme.AppCompat.DayNight是否可行,是否会破坏Compose功能? - 用
AppCompatActivity替代ComponentActivity有什么弊端,比如是否影响Compose、增大APK体积? - 设置“跟随系统主题”时,
setDefaultNightMode()有MODE_NIGHT_FOLLOW_SYSTEM,但setApplicationNightMode()只有按时间切换的MODE_NIGHT_AUTO和MODE_NIGHT_CUSTOM,如何不破坏Android 10+原生深色模式功能?
内容的提问来源于stack exchange,提问作者l'hiverviendra
相关产品推荐
相关产品推荐

