Android Jetpack Compose:如何通过编程将主题从亮模式更改为暗模式onClick

Android Jetpack Compose:如何通过编程将主题从亮模式更改为暗模式onClick,android,kotlin,android-theme,android-jetpack,android-jetpack-compose,Android,Kotlin,Android Theme,Android Jetpack,Android Jetpack Compose,TL;DR更改主题并在单击时在亮主题和暗主题之间重新组合应用程序 你好!!我有一个有趣的问题,我一直在努力想办法解决,希望能得到一些帮助。我正在尝试实现一个设置屏幕,允许用户更改应用程序的主题(选择与系统设置匹配的暗、亮或自动) 在选择调色板时,我通过调用isSystemInDarkTheme()函数成功地动态设置主题,但我很难通过单击按钮在明暗主题之间重新组合应用程序 我现在的策略是创建一个主题模型,从用户实际选择主题的设置组件中提升状态。然后,此主题模型向自定义主题(环绕材质主题)公开主题状

TL;DR更改主题并在单击时在亮主题和暗主题之间重新组合应用程序

你好!!我有一个有趣的问题,我一直在努力想办法解决,希望能得到一些帮助。我正在尝试实现一个设置屏幕,允许用户更改应用程序的主题(选择与系统设置匹配的暗、亮或自动)

在选择调色板时,我通过调用isSystemInDarkTheme()函数成功地动态设置主题,但我很难通过单击按钮在明暗主题之间重新组合应用程序

我现在的策略是创建一个主题模型,从用户实际选择主题的设置组件中提升状态。然后,此主题模型向自定义主题(环绕材质主题)公开主题状态变量,以决定是选择浅色还是深色调色板。以下是相关代码-->

主题

主题模型与状态变量

class ThemeViewModel : ViewModel() {
private val _theme = MutableLiveData("Auto")
val theme: LiveData<String> = _theme

fun onThemeChanged(newTheme: String) {
    when (newTheme) {
        "Auto" -> _theme.value = "Light"
        "Light" -> _theme.value = "Dark"
        "Dark" -> _theme.value = "Auto"
    }
}
}

非常感谢您的时间和帮助***我在UI组件中省略了一些代码,在这个过程中可能遗漏了一些闭包语法。

中显示的一种可能性是通过输入参数设置暗模式,以确保在参数更改时重新组合主题:

@Composable
fun CustomTheme(
  darkTheme: Boolean = isSystemInDarkTheme(),
  content: @Composable () -> Unit
) {
  MaterialTheme(
    colors = if (darkTheme) DarkColors else LightColors,
    content = content
  )
}
在mainActivity中,您可以观察对viewModel的更改,并将其传递给customTheme:

val darkTheme = themeViewModel.darkTheme.observeAsState(initial = true)

CustomTheme(darkTheme.value){
//yourContent
}
这样,您的撰写预览可以简单地在黑暗主题中设置样式:

@Composable
private fun DarkPreview() {
    CustomTheme(darkTheme = true) {
        content
    }
}

你在哪里应用你的主题?我在MainActivity中应用我的主题,像样板组合项目设置一样围绕主组合。我认为这些变化被正确地观察到了,我可以说,因为当我将系统设置从亮主题切换到暗主题时,应用程序会做出响应。我搞不懂的是如何在单击按钮时将主题从暗切换到亮。您正在可组合设置中观察主题更改,但在自定义主题中没有观察到主题更改:
val colors=when(themeViewModel.theme.value.toString())
,因此,它们不会应用于你的主题即使当我观察到自定义主题中的更改时,当单击主题更改时,应用程序也不会重新编译。您的建议无效,但谢谢。您确定使用的是同一个viewModel实例吗?
val darkTheme = themeViewModel.darkTheme.observeAsState(initial = true)

CustomTheme(darkTheme.value){
//yourContent
}
@Composable
private fun DarkPreview() {
    CustomTheme(darkTheme = true) {
        content
    }
}