gpt4 book ai didi

android - Jetpack 撰写 : How to change theme from light to dark mode programmatically onClick

转载 作者:行者123 更新时间:2023-12-04 12:23:16 25 4
gpt4 key购买 nike

TL;DR 更改主题并在点击时在浅色和深色主题之间重新组合应用程序。
你好!我有一个有趣的问题,我一直在努力解决,希望得到一些帮助。我正在尝试实现一个设置屏幕,让用户更改应用程序的主题(选择与系统设置匹配的暗、亮或自动)。
我设置主题成功动态通过调用 isSystemInDarkTheme() 选择调色板时的功能,但我正在努力 重构 单击按钮即可在浅色和深色主题之间的应用程序。
我现在的策略是创建一个主题模型,该模型从用户实际选择主题的设置组件中提升状态。然后该主题模型将主题状态变量公开给自定义主题(围绕 Material 主题)以决定是否选择浅色或深色调色板。这是相关代码-->
主题

@Composable
fun CustomTheme(
themeViewModel: ThemeViewModel = viewModel(),
content: @Composable() () -> Unit,
) {
val colors = when (themeViewModel.theme.value.toString()) {
"Dark" -> DarkColorPalette
"Light" -> LightColorPalette
else -> if (isSystemInDarkTheme()) DarkColorPalette else LightColorPalette
}

MaterialTheme(
colors = colors,
typography = typography,
shapes = shapes,
content = content
)
}
主题模型和状态变量
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 Settings(
themeViewModel: ThemeViewModel = viewModel(),
) {
...
val theme: String by themeViewModel.theme.observeAsState("")
...
ScrollableColumn(Modifier.fillMaxSize()) {
Column {
...
Card() {
Row() {
Text(text = theme,
modifier = Modifier.clickable(
onClick = {
themeViewModel.onThemeChanged(theme)
}
)
)
}
}
}
非常感谢您的时间和帮助! ***我在 UI 组件中省略了一些代码,可能我在此过程中遗漏了一些闭包语法。

最佳答案

一种可能性,在 Jetpack theming codelab 中显示, 是通过输入参数设置暗模式,这样可以保证在参数变化时重新组合主题:

@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
}
}

关于android - Jetpack 撰写 : How to change theme from light to dark mode programmatically onClick,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65192409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com