如何让Material 3按钮禁用状态与启用状态颜色保持一致?
解决Compose按钮禁用状态保留启用默认颜色的问题
要实现禁用状态下按钮保持启用时的默认颜色,你可以通过两种方式获取启用状态的默认颜色值:
方法1:直接调用ButtonDefaults的默认颜色配置
ButtonDefaults.buttonColors()会返回默认的按钮颜色配置对象,其中的containerColor和contentColor就是启用状态下的默认值。你可以直接引用这些值,赋值给禁用状态对应的参数:
@Preview @Composable private fun ButtonSandbox() { // 获取默认启用状态的按钮颜色配置 val enabledButtonColors = ButtonDefaults.buttonColors() Button( enabled = false, modifier = Modifier.fillMaxWidth(), onClick = {}, colors = ButtonDefaults.buttonColors( // 启用状态保持默认(可选,不设置也会用默认) containerColor = enabledButtonColors.containerColor, contentColor = enabledButtonColors.contentColor, // 禁用状态强制使用启用时的颜色 disabledContainerColor = enabledButtonColors.containerColor, disabledContentColor = enabledButtonColors.contentColor ) ) { CircularProgressIndicator( modifier = Modifier.size(ButtonDefaults.IconSize) ) } }
方法2:从Material主题中获取对应颜色值
默认按钮的启用状态颜色是基于当前Material主题的primary和onPrimary色值,你可以直接从主题中读取:
@Preview @Composable private fun ButtonSandbox() { val colorScheme = MaterialTheme.colorScheme Button( enabled = false, modifier = Modifier.fillMaxWidth(), onClick = {}, colors = ButtonDefaults.buttonColors( disabledContainerColor = colorScheme.primary, disabledContentColor = colorScheme.onPrimary // 启用状态的颜色不设置的话会自动使用主题默认,无需额外赋值 ) ) { CircularProgressIndicator( modifier = Modifier.size(ButtonDefaults.IconSize) ) } }
说明
- 方法1的优势是完全复用Compose默认按钮的颜色逻辑,即使后续主题修改了按钮默认色,代码也会自动适配;
- 方法2更直接,适合明确知道主题色对应关系的场景。
内容的提问来源于stack exchange,提问作者me.at.coding
相关产品推荐
相关产品推荐

