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