【问题标题】:ImeAction moves cursor to the beginning of a TextFieldImeAction 将光标移动到 TextField 的开头
【发布时间】:2021-12-08 13:49:44
【问题描述】:

当我单击“下一步”ImeAction 时,光标位置会转到新选择的 TextField 的先前记忆位置(即,如果您曾经手动设置光标位置)。如果没有,那么即使 TextField 不为空,光标也会跳到开头。当通过 ImeAction 获得焦点时,我希望光标始终位于最后。

示例代码(为简单起见,我在这里保持可变状态,不使用 ViewModel):

@Composable
fun ImeActionIsBroken() {
    val focusRequester = remember { FocusRequester() }
    Column {
        var value1 by rememberSaveable { mutableStateOf("Some value 1") }
        TextField(
            value = value1,
            onValueChange = { value1 = it },
            modifier = Modifier.fillMaxWidth(),
            keyboardActions = KeyboardActions {
                focusRequester.requestFocus()
            },
            singleLine = true
        )

        var value2 by rememberSaveable { mutableStateOf("Some value 2") }
        TextField(
            value = value2,
            onValueChange = { value2 = it },
            modifier = Modifier
                .fillMaxWidth()
                .focusRequester(focusRequester),
            singleLine = true
        )
    }
}

撰写版本 1.0.5

【问题讨论】:

    标签: android-jetpack-compose android-jetpack-compose-text android-jetpack-compose-list


    【解决方案1】:

    您可以使用TextFieldValue 对象而不是对我们的TextField 使用String。有了它,您可以自定义选定的文本范围/或文本光标的位置。

    在您的示例中,您应该将 value2 的声明上移,以便第一个文本字段的 KeyboardAction 回调可以访问。 然后将其更新为 TextFieldValue,如下所示:

    var value2 by rememberSaveable { mutableStateOf(TextFieldValue("Some value 2")) }
    

    在 KeyboardAction 中,您可以在请求焦点之前将选择更新为位于字段的末尾,就像这样:

    value2 = value2.copy(selection = TextRange(value2.text.length))
    focusRequester.requestFocus()
    

    【讨论】:

    • 好像是我需要的,谢谢
    猜你喜欢
    • 2011-05-09
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多