如何使用 Jetpack Compose 显示键盘?

Ral*_*kum 17 android-windowmanager android-window android-jetpack android-jetpack-compose

如何滑入键盘?我试过:

val keyboardController: SoftwareKeyboardController? = LocalSoftwareKeyboardController.current
  keyboardController?.show()
Run Code Online (Sandbox Code Playgroud)

但这不起作用。我缺少什么?也许一些清单标志?

jor*_*uke 24

要在 Compose 中显示键盘:

val showKeyboard = remember { mutableStateOf(true) }
val focusRequester = remember { FocusRequester() }
val keyboard = LocalSoftwareKeyboardController.current

OutlinedTextField(
    modifier = Modifier
            .fillMaxWidth()
            .focusRequester(focusRequester),
    value = value,
    textStyle = MaterialTheme.typography.body2,
    onValueChange = { onValueChange(it)},
    label = { Text(label) }
)

// LaunchedEffect prevents endless focus request
LaunchedEffect(focusRequester) {
    if (showKeyboard.equals(true)) {
        focusRequester.requestFocus()
        delay(100) // Make sure you have delay here
        keyboard?.show()
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 当您打开对话框并希望对话框中的文本字段自动聚焦并打开键盘滑动时,此代码不起作用。文本字段聚焦,但键盘无法滑开。 (7认同)
  • showKeyboard.equals(true) 在这里总是返回 false,因为 equals() 指示另一个对象是否“等于”另一个对象,而不是它们具有相同的值。请参阅此处的示例 - https://www.educative.io/answers/what-is-objectsequals-in-java ,而只需使用 if(showKeyboard.value) (3认同)

小智 14

delay不是显示键盘的可靠方法。不显示键盘是因为在大多数情况下窗口尚未获得焦点。解决方案是这样的:

val windowInfo = LocalWindowInfo.current
val focusRequester = remember { FocusRequester() }
TextField(modifier = Modifier.focusRequester(focusRequester)...)

LaunchedEffect(windowInfo) {
     snapshotFlow { windowInfo.isWindowFocused }.collect { isWindowFocused ->
         if (isWindowFocused) {
             focusRequester.requestFocus()
         }
     }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

我目前使用的是 compose BOM 版本2023.05.01

其他答案对我不起作用。然而,当我从接受的答案中更改 LaunchedEffect 时,我确实设法让它工作。使用以下代码片段,软件键盘将打开,您可以开始在文本字段内键入内容。

val focusRequester = remember { FocusRequester() }

OutlinedTextField(
    modifier = Modifier
            .fillMaxWidth()
            .focusRequester(focusRequester),
    value = value,
    textStyle = MaterialTheme.typography.body2,
    onValueChange = { onValueChange(it)},
    label = { Text(label) }
)

LaunchedEffect(focusRequester) {
   awaitFrame()
   focusRequester.requestFocus()
}
Run Code Online (Sandbox Code Playgroud)