如何在Jetpack Compose中更改TextField的高亮文本颜色?

28

我目前正在将我的应用程序转换到Jetpack Compose,并且在某些情况下,我面临一些问题来适应我当前的颜色调色板。

我在xml文件中有一些TextInputLayout,它们从我的主题中的SECUNDARY颜色继承突出显示文本颜色。

<style name="Theme.MyApp" parent="Theme.MaterialComponents.Light.NoActionBar">
    ...
    <item name="colorPrimary">@color/blue</item>
    <item name="colorPrimaryVariant">@color/blue</item>
    <item name="colorSecondary">@color/red</item>
    <item name="colorSecondaryVariant">@color/red</item>
    ...
</style>

TextInputLayout with theme's secondary colour - xml

我的问题是,我在Compose中使用的TextFieldMaterialTheme的PRIMARY颜色继承了高亮文本颜色。

MaterialTheme(
    colors = Colors(
        primary = Color.Blue,
        ...
        secondary = Color.Red,
        ...
    ),
    content = content,
    typography = MaterialTheme.typography,
    shapes = MaterialTheme.shapes,
) {
   TextField(...)
}

使用主题的主色调覆盖的TextField - compose

我在 TextField 上覆盖了 colors 参数,但似乎没有影响到这个颜色。

是否有方法在不更改 MaterialTheme 中的 colors 的情况下覆盖 compose 上的高亮颜色?我想避免这种情况,因为它可能会对使用相同主题的其他屏幕造成问题。


仅进行注释以便于搜索:textSelectHandle 用于撰写,文本选择颜色。 - Carsten Hagemann
1个回答

69

文本和文本字段组件所使用的文本选择颜色由 LocalTextSelectionColors.current 提供。

您可以使用以下方式提供自定义的TextSelectionColors

val customTextSelectionColors = TextSelectionColors(
    handleColor = Red,
    backgroundColor = Red.copy(alpha = 0.4f)
)

CompositionLocalProvider(LocalTextSelectionColors provides customTextSelectionColors) {
    TextField(
        value = text,
        onValueChange = { text = it },
        colors = TextFieldDefaults.textFieldColors(cursorColor = Red)
    )
}

如果你想改变光标的颜色,还需添加colors = TextFieldDefaults.textFieldColors(cursorColor = Red)

enter image description here


那对于一个 BasicTextField 呢? - Charles Woodson
@CharlesWoodson 使用相同的 LocalTextSelectionColors。 - Gabriele Mariotti
2
它也适用于BasicTextField。 - Tippu Fisal Sheriff
1
我可以在主题级别上定义它吗?将其包装在TextField中会导致代码重复更多。 - Harry T.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接