【问题标题】:Compose - TextField - SelectAllOnFocus撰写 - 文本字段 - SelectAllOnFocus
【发布时间】:2021-11-23 22:33:57
【问题描述】:

如果我们希望我们的 TextField 具有与 EditText:selectAllOnFocus = "true" 等效的行为,我们可以创建一个 TextFieldValue 并将选择从零设置为长度,如 TextRange(0, text.length)

这很有效,当用户聚焦 TextField 时,整个文本都会被选中,问题是当我们创建一个 TextFieldValue 时,我们需要设置选择,默认值是零。

如果用户想拖动光标,他就是不能。现在有没有办法创建一个 selectAllOnFocus 行为,允许用户在撰写时将光标拖到整个文本上?

【问题讨论】:

  • 我试过了,这样你就不能在TextField上拖动光标了......
  • 不确定“拖动光标”是什么意思。光标可见后,您可以将其拖动到任意位置。
  • 你不能,我认为它用 textFieldValue 重新组合并重置光标位置,不确定
  • 您想要一个可编辑的选择吗?这样您就可以拖动两个点并复制,剪切等

标签: android-jetpack-compose android-jetpack


【解决方案1】:

是的,我认为一种方法是遵循来自 TextField onValueChange 回调的结果选择:

var editableText by rememberSaveable { mutableStateOf("some text") }
val textRangeStart = rememberSaveable { mutableStateOf(0) }
val textRangeEnd = rememberSaveable { mutableStateOf(0) }
val textField = remember(editableText, textRangeEnd.value, textRangeStart.value) {
    mutableStateOf(
        TextFieldValue(
            text = editableText ?: "",
            selection = TextRange(textRangeStart.value, textRangeEnd.value)
        )
    )
}
TextField(
        modifier = Modifier.fillMaxSize(),
        value = textField.value,
        placeholder = { Text("") },
        onValueChange = {
            textEditorViewModel.editableText.value = it.text
            textRangeStart.value = it.selection.start
            textRangeEnd.value = it.selection.end
        }
    )
}

【讨论】:

  • 它成功了,最后我只需要跟踪 textRangeStart 和 textRangeEnd 以允许用户拖动光标,谢谢!
  • @IvanRegados 是的,这就是诀窍
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
相关资源
最近更新 更多