0

当我单击“下一步”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

4

1 回答 1

0

您可以使用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()
于 2021-12-08T17:09:56.640 回答