如何在文本可组合项上实现禁用外观

Rob*_*rdi 9 android material-design android-jetpack-compose

我正在尝试在 Compose 中重新创建首选项屏幕,但我不确定实现项目禁用状态的最佳方法是什么。

这是禁用状态的示例:

使用旧方法,TextView我可以轻松使用该方法setEnabled(),该方法将帮助我禁用单击侦听器并更改文本颜色。可组合项Text()似乎没有实现此功能,因此我想知道是否有一种简单的方法可以实现相同的结果。

理想情况下,我想找到一种简单的方法来获取默认禁用颜色或默认 alpha 应用于当前文本颜色以实现禁用外观。

Phi*_*hov 7

您可以使用ContentAlpha.disabled

要将其应用于一堆视图,您可以提供LocalContentAlpha

CompositionLocalProvider(
    LocalContentAlpha provides if (enabled) ContentAlpha.high else ContentAlpha.disabled,
) {
    Text("title", color = Color.DarkGray.copy(LocalContentAlpha.current))
    Text("subtitle", color = Color.LightGray.copy(LocalContentAlpha.current))
}
Run Code Online (Sandbox Code Playgroud)

请注意,为了使LocalContentAlphaLocalContentColor工作,您的Text colorstyle.color参数应该是Color.Unspecified(这是默认值)。如果您直接指定,则可以ContentAlpha.disabled手动应用:

Text(
    "your text",
    color = Color.Black.copy(alpha = ContentAlpha.disabled),
    // or if you're using colored style
    style = MaterialTheme.typography.body1.let { style ->
        style.copy(color = style.color.copy(alpha = ContentAlpha.disabled))
    },
    // or just apply alpha modifier to the view
    modifier = Modifier.alpha(ContentAlpha.disabled)
)
Run Code Online (Sandbox Code Playgroud)


Rob*_*rdi 5

我找到了一个解决方案,但我不确定是否是最好的:我不是更改文本的颜色,而是使用 更改整个可组合项的 alphaModifier并将 alpha 设置为中定义的值ContentAlpha.disabled

val alpha = if (enabled) 1f else ContentAlpha.disabled
Text(
    modifier = Modifier
        .alpha(alpha = alpha)
        .clickable(enabled = enabled) { onClick() },
    text = "Lorem ipsum",
)
Run Code Online (Sandbox Code Playgroud)