ImeAction 将光标移动到 TextField 的开头

ImeAction moves cursor to the beginning of a TextField

当我单击“下一步”ImeAction 时,光标位置会转到新选择的 TextField 之前记住的位置(即,如果您曾经手动设置光标位置)。如果有 none,那么即使 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
        )
    }
}

Compose 版本 1.0.5

您可以使用 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()