如何从 Jetpack Compose TextField 关闭虚拟键盘?

ngl*_*ber 19 android android-input-method kotlin android-jetpack-compose android-compose-textfield

我正在使用 Jetpack Compose TextField,我想在用户按下操作按钮(imeActionPerformed参数)时关闭虚拟键盘。

val text = +state { "" }
TextField(
    value = text.value,
    keyboardType = KeyboardType.Text,
    imeAction = ImeAction.Done,
    onImeActionPerformed = { 
        // TODO Close the virtual keyboard here <<<
    }
    onValueChange = { s -> text.value = s }
)
Run Code Online (Sandbox Code Playgroud)

Gab*_*tti 42

有了1.0.x你可以使用LocalSoftwareKeyboardController类来控制电流软键盘,然后使用hide方法:

var text by remember { mutableStateOf(TextFieldValue("Text")) }
val keyboardController = LocalSoftwareKeyboardController.current

TextField(
        value = text,
        onValueChange = {
            text = it
        },
        label = { Text("Label") },
        keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
        keyboardActions = KeyboardActions(
                onDone = {keyboardController?.hide()})
)
Run Code Online (Sandbox Code Playgroud)

  • 这是每个 Android 开发者的梦想 (7认同)
  • 这和 focusManager 方法(/sf/answers/4638137801/)有什么区别?我们什么时候应该使用每一个? (3认同)
  • @stkent 此解决方案仅隐藏键盘。另一个解决方案也从当前的 TextField 中移除焦点(光标仍在显示,它可能仍然突出显示等) (2认同)

azi*_*ian 29

从 compose 开始1.0.0-alpha12(并且在 compose 中仍然有效1.0.1onImeActionPerformed已弃用,建议的方法是keyboardActions与以下组合一起使用keyboardOptions

    val focusManager = LocalFocusManager.current

    OutlinedTextField(
        value = ...,
        onValueChange = ...,
        label = ...,
        keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
        keyboardOptions = KeyboardOptions.Default.copy(imeAction = ImeAction.Done, keyboardType = KeyboardType.Password),
    )
Run Code Online (Sandbox Code Playgroud)

focusManager.clearFocus() 将负责关闭软键盘。

  • @shelll尝试在对话框内初始化FocusManager。就我而言,它有效。 (2认同)

Has*_*san 11

单击按钮时隐藏键盘

要添加Gabriele Mariotti 的解决方案,如果您想有条件地隐藏键盘,例如单击按钮后,请使用以下命令:

keyboardController?.hide()
Run Code Online (Sandbox Code Playgroud)

例如,单击“添加”按钮后隐藏键盘:

var newWord by remember { mutableStateOf("") }
val keyboardController = LocalSoftwareKeyboardController.current

// Setup the text field with keyboard as provided by Gabriele Mariotti

...

Button(
        modifier = Modifier
                .height(56.dp),
        onClick = {
                if (!newWord.trim().isNullOrEmpty()) {
                        wordViewModel.onAddWord(newWord.trim())
                        newWord = ""
                        keyboardController?.hide()
                }
        ...
Run Code Online (Sandbox Code Playgroud)


m.r*_*ter 5

1.0.0您可以使用SoftwareKeyboardControllerFocusManager来做到这一点。

这个答案侧重于它们的差异。


设置:

var text by remember { mutableStateOf("")}

TextField(
    value = text,
    onValueChange = { text = it },
    keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
    keyboardActions = KeyboardActions(onDone = { /* TODO */ }),
)
Run Code Online (Sandbox Code Playgroud)

设置


软件键盘控制器:

根据@Gabriele Mariottis答案。

val keyboardController = LocalSoftwareKeyboardController.current

// TODO =
keyboardController?.hide()
Run Code Online (Sandbox Code Playgroud)

这仅关闭键盘,但清除的重点从任何集中文本字段(注意光标和粗底线)。

使用键盘控制器


焦点管理器:

根据@azizbekians答案。

val focusManager = LocalFocusManager.current

// TODO =
focusManager.clearFocus()
Run Code Online (Sandbox Code Playgroud)

使用焦点管理器

这将关闭键盘并清除 TextField 的焦点。


归档时间:

查看次数:

5424 次

最近记录:

4 年,1 月 前