You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 04:31:05