【问题标题】:Issue with TextField with multiple styles when typing. Only last char is styled键入时具有多种样式的 TextField 出现问题。只有最后一个字符是样式
【发布时间】:2021-11-22 17:29:30
【问题描述】:

在我的 UI 上选择一个按钮后,我想将粗体样式应用于我正在输入的文本 我不明白为什么只有最后一个字符加粗,而前一个字符都设置为默认样式。 我究竟做错了什么?为什么 TextField 不记得之前加粗的内容?

例子:

我想要的: 这是我想要的文本

的示例

我得到了什么: 这是我想要的文本示例t

 val textState = remember { mutableStateOf(TextFieldValue()) }


TextField(
    value = textState.value,
    onValueChange = {

        val prevPos = textState.value.selection.start
     

        if (selectedButton1.value) {
            val annotatedString = buildAnnotatedString {
                append(it.text)

                addStyle(
                    SpanStyle(fontWeight = FontWeight.Bold),
                    prevPos,
                    it.text.length
                )
            }

            textState.value =  it.copy(annotatedString, it.selection, it.composition)
        } else {
            textState.value =  it
        }
    },

    placeholder = { Text(placeholder, style = textStyle) },
    modifier = modifier,
    enabled = enabled,
    textStyle = textStyle,...

【问题讨论】:

    标签: android textfield android-jetpack-compose


    【解决方案1】:

    每次计算前一个pos;因此它只是最后一个字符。由于光标移动,新的 TextFileValue 将具有旧的 +1。 如果你想从一个按钮中选择,你可以使用另一种状态。

    var prevPos by remember { mutableStateOf(0) }
    

    在按钮中:

    onClick = {
       // Before typing:
       prevPos = textState.value.selection.start
    }
    

    【讨论】:

    • 你能告诉我在哪里初始化这个 prevPos 吗?我确实将它添加到 TextField 上方,但现在我输入的整个文本都加粗了。即使是前一个也不应该加粗。
    • 如果我想在文本的多个部分使用粗体怎么办?
    • 首先查看编辑,对于您需要将开始和结束位置保存在粗体文本中的多个部分。并将其传递给多个 addStyle
    • 你能给我一个小例子,说明如何保存结束位置并同时应用粗体样式吗?请?谢谢
    • 选项:a) 另一个具有开始和结束索引的类;或 b) 将其编码为文本字符串,如粗体开头的“”和结尾的“”。此信息可以在注解构建器中解析。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 2012-08-10
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多