Android Compose - 不会使用 Toggle 切换深色/浅色模式

android compose - wont switch dark/light mode with toggle

提问人:Collin Franckena 提问时间:11/2/2023 更新时间:11/2/2023 访问量:42

问:

对于学校项目,我需要实现深色/浅色模式的切换。我正在使用 Jetpack Compose。它切换 AppCompatDelegate 夜间模式。但它不会重新组合成黑暗主题。主题是使用 Material 3 主题构建器构建的。

用于切换暗模式的开关

SettingsSwitch(
                icon = {
                    Icon(
                        imageVector = Icons.Outlined.DarkMode,
                        contentDescription = "DarkMode"
                    )
                },
                title = { Text(text = stringResource(id = R.string.setting_darkmode)) },
                onCheckedChange = {
                    AppCompatDelegate.setDefaultNightMode(
                        if (it) MODE_NIGHT_YES else MODE_NIGHT_NO
                    )
                    println(AppCompatDelegate.getDefaultNightMode().toString())
                },
                state = stateSettingDarkMode,
                enabled = !stateSettingSystemDarkMode.value
            )

和 Theme.kt(没有 collorschemes)

@Composable
fun AppTheme(
    useDarkTheme: Boolean = isNightMode(),
    content: @Composable() () -> Unit
) {
    val colors = if (!useDarkTheme) {
        LightColors
    } else {
        DarkColors
    }

    MaterialTheme(
        colorScheme = colors,
        content = content
    )
}

@Composable
private fun isNightMode() = when (AppCompatDelegate.getDefaultNightMode()) {
    AppCompatDelegate.MODE_NIGHT_NO -> false
    AppCompatDelegate.MODE_NIGHT_YES -> true
    else -> isSystemInDarkTheme()
}
安卓 android-jetpack-compose 暗模式 android-jetpack-compose-material3

评论


答:

0赞 Darian-Cătălin Cucer 11/2/2023 #1
SettingsSwitch(
        icon = {
            Icon(
                imageVector = Icons.Outlined.DarkMode,
                contentDescription = "DarkMode"
            )
        },
        title = { Text(text = stringResource(id = R.string.setting_darkmode)) },
        onCheckedChange = { checked ->
            isDarkTheme.value = checked
            AppCompatDelegate.setDefaultNightMode(
                if (checked) MODE_NIGHT_YES else MODE_NIGHT_NO
            )
        },
        state = isDarkTheme.value,
        enabled = !stateSettingSystemDarkMode.value
    )

@Composable
fun AppTheme(content: @Composable () -> Unit) {
    val isDarkTheme = remember { mutableStateOf(isSystemInDarkTheme()) }

    val colors = if (!isDarkTheme.value) {
        LightColors
    } else {
        DarkColors
    }

    MaterialTheme(
        colorScheme = colors,
        content = content
    )
}