Jetpack Compose 的 TextField 如何捕获键盘的 Enter 输入?

15

据我所知,Jetpack Compose Textfield 有一个API可以捕获键盘操作,但我不知道哪个API可以捕获“回车”输入。

捕获回车输入的使用场景是使用户能够点击 Enter 键尝试进入下一个文本字段,并保持键盘处于打开状态。

OutlinedTextField(
    value = username.value,
    onValueChange = {
        username.value = it
        },
    keyboardActions = KeyboardActions(
        onDone = {},
        onGo = {},
        onNext = {},
        onPrevious ={},
        onSearch ={},
        onSend = {}
        )
)

1
附加问题:我似乎无法让物理键盘执行 IME 操作。我需要在物理键盘按下回车后运行我的 onDone / onSubmit,但它只会创建一个新行。 - dessalines
1个回答

22

您可以使用类似以下内容的代码:

val (focusRequester) = FocusRequester.createRefs()

TextField(
    value = text,
    onValueChange = {
        text = it
    },
    singleLine = true,
    keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
    keyboardActions = KeyboardActions(
        onDone = { focusRequester.requestFocus() }
    ),
    modifier = Modifier.onKeyEvent {
        if (it.nativeKeyEvent.keyCode == KeyEvent.KEYCODE_ENTER){
            focusRequester.requestFocus()
            true
        }
        false
    }
)

TextField(
    value = text2,
    onValueChange = {
        text2 = it
    },
    modifier = Modifier.focusRequester(focusRequester),
)

谢谢,我已经尝试将以下代码添加到第二个文本字段中:singleLine = true, keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), keyboardActions = KeyboardActions( onDone = { focusRequester.requestFocus() } ), modifier = Modifier.onKeyEvent { if (it.nativeKeyEvent.keyCode == KeyEvent.KEYCODE_ENTER){ focusRequester.requestFocus() true } false }并使用 focusRequester.freeFocus() 替代,但是它似乎没有从第二个文本字段中移除焦点。对此有什么想法吗? - Arthur
1
@ArcRuler 使用 val focusManager = LocalFocusManager.current,并在第二个字段的 Modifier.onKeyEvent 中添加 focusManager.clearFocus() - Gabriele Mariotti
我该如何在那里运行IME操作?物理键盘输入不会触发任何IME操作,而我需要它在完成时运行。 - dessalines
@dessalines 我猜这是屏幕键盘上的“完成”按钮。GabrieleMariotti 我猜你在 "false" 之前漏掉了 "else"。 - midenok
onValueChange有什么作用? - midenok
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接