Jetpack Compose:如何以编程方式 onClick 将主题从浅色模式更改为深色模式

2024-02-14

TL;DR 更改主题并在单击时在浅色和深色主题之间重新组合应用程序。

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

我已成功设置主题动态地通过调用isSystemInDarkTheme()选择调色板时的功能,但我很难重组单击按钮即可在浅色和深色主题之间切换应用程序。

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

Theme

@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 主题代码实验室 https://developer.android.com/codelabs/jetpack-compose-theming#3,就是通过输入参数设置暗模式,保证参数变化时主题会重新组合:

@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
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jetpack Compose:如何以编程方式 onClick 将主题从浅色模式更改为深色模式 的相关文章

随机推荐

  • 如何从 json 字典自动创建模型类(NSObject)?

    有没有办法创建字典或 json 响应的模型类 包装器 因为在我的应用程序中有很多网络服务 并且所有 WS 都包含大数据 如果我一直一一创建 则需要花费很多时间来创建带有检查空数据和编码解码对象的 NSObject 类 请建议我手动创建所有
  • 在包含路径 phpstorm 中找不到 PHPUnit

    Cannot find PHPUnit in include path是我尝试在 phpstorm 中运行代码时收到的错误消息 在 PHP 设置中 我的 PHP 级别语言是5 4 traits short array syntax etc
  • 使用 EWS API 将邮件保存到 msg 文件

    我正在使用 Exchange Web Services Managed API 1 1 连接到 Exchange Server 2010 然后查找收到的新电子邮件 现在我想将 msg 文件的副本保存到磁盘上的文件夹中 我不想使用任何付费第三
  • python 中的阿姆斯特朗数

    num int input please enter number for num in range num 1000 sum1 0 numcp num if num gt 10 and num lt 100 while num gt 0
  • 在脚本的Google表格中获取带有#NA的公式的错误注释

    我找不到任何方法来获取失败公式的错误消息 实际上它提供了更多信息 而只是错误代码 因为 NA 始终为 7 NA 可能意味着不同的东西 我希望能够识别哪些细胞具有哪种类型的 NA getNote不起作用 有办法吗 我使用 IMPORTXML
  • 错误:未定义标签,如何在java中使用此代码中的标签语句?

    我在Java教科书中读到任何语句都可以被标记并且可以与break一起使用 但是在尝试此代码时 我收到错误未定义标签 stackoverflow 的伙计们在将这个问题标记为重复之前先等待 我已经检查了这些问题 但没有一个解释这个问题 publ
  • 如何从文件类型获取文件扩展名?

    我有一个文件名列表如下 files dl files 4j55eeer wq3wxxpiqm jpg home Desktop hjsd03wnsbdr9rk3k kd0dje7cmidj0xks03nd8nd8a3 问题是大多数文件的文件
  • SAP Crystal Reports Viewer 不显示在浏览器中

    我拥有一个使用框架 4 5 的 ASP NET Web 项目 已安装并实施适用于 VS2012 Crystal Reports Developer 的 SAP 报表 在本地报告中 它可以在浏览器 Chrome Firefox IE 中正常工
  • 有没有 numpy group by 函数?

    numpy 中是否有任何函数可以按第一列将该数组分组到下面 我在互联网上找不到任何好的答案 gt gt gt a array 1 275 1 441 1 494 1 593 2 679 2 533 2 686 3 559 3 219 3 4
  • Bootstrap 3 中的垂直对齐字形

    我有一个这样的字形 div class col xs 4 col sm 2 span class glyphicon glyphicon circle arrow up glyphicon large span div glyphicon
  • 在 WordPress 中获取页面(无帖子)的精选图像

    我需要显示所有页面的特色图像 而不是帖子 我有这个代码 img src class header img alt 但这仅显示一张特色图像 太感谢了 您可以简单地使用 WP Query 来获取它 loop new WP Query array
  • Yii2 自定义分页联合查询

    我想在 Yii2 中实现自定义分页 这是我的代码 connection Yii app gt getDb name GET name query SELECT name FROM user WHERE name LIKE name UNIO
  • Python 将十进制转换为十六进制

    我这里有一个函数可以将十进制转换为十六进制 但它以相反的顺序打印它 我该如何解决它 def ChangeHex n if n lt 0 print 0 elif n lt 1 print n else x n 16 if x lt 10 p
  • jQuery:无限滚动和后退按钮

    好吧 我知道这会给每个人带来问题 也给我带来问题 我在客户的网站上使用无限滚动插件 结合同位素插件按顺序加载他们的产品 问题是 因为他们有 1000 种产品 任何浏览该网站然后点击进入产品的人 当他们点击按后退按钮 它们将返回到顶部 或第一
  • 将多个文件导入到 R 中的单个合并数据框中

    我有 8 个 CSV 文件都在同一目录中 需要将它们导入到 R 中的单个数据框中 它们都遵循相同的命名约定 dataUK 1 csv dataUK 2 csv 等 并且具有完全相同的功能列的结构 我已经成功地使用以下方法创建了所有文件名 包
  • VS 2012 中的可变参数模板(Visual C++ 2012 年 11 月 CTP)

    我安装了Visual C 编译器 2012 年 11 月 CTP http www microsoft com en us download details aspx id 35515并创建了一个 C 控制台项目 我把这个写在 templa
  • 单态与单态

    当人们使用单态模式而不是单例来维护全局对象时 会出现什么情况 编辑 我知道什么是单例模式和单态模式 在很多场景中也实现了 Singleton 只是想知道MonoState模式需要实现的场景 案例 例如 我需要在 Windows 窗体应用程序
  • 如何设置 LIBUSB_INCLUDE_DIR

    我正在尝试为arm交叉编译libftdi 当我运行 Cmake 时 我得到 CMake Error The following variables are used in this project but they are set to N
  • 在 Iphone SDK 中显示 GPS 可用性和准确性

    如何编程以在 iPhone 中显示 GPS 可用性和准确度级别 并且它必须擦除标签中先前的纬度 经度信息 iOS sdk 中有一个类叫做 CLLocationManager 浏览 XCode 中的文档或查找一些示例 http mobileo
  • Jetpack Compose:如何以编程方式 onClick 将主题从浅色模式更改为深色模式

    TL DR 更改主题并在单击时在浅色和深色主题之间重新组合应用程序 你好 我有一个有趣的问题 我一直在努力解决 希望得到一些帮助 我正在尝试实现一个设置屏幕 让用户更改应用程序的主题 选择与系统设置匹配的深色 浅色或自动 我已成功设置主题动