Android Compose文本字段如何在触摸外部时关闭键盘

16

这里有一行代码,其中包含一个全屏列中的文本框。当点击文本框(进入活动状态)以及在键盘中按下完成按钮时,会调用onFocusChanged回调函数。但是当我点击文本框外部时,处理程序没有被调用。因此,我无法关闭键盘。有什么想法吗?

val (nameText, setNameText) = remember { mutableStateOf("")}
val keyboardController = LocalSoftwareKeyboardController.current
val focusRequester = FocusRequester()

Column(
    modifier = Modifier
        .fillMaxWidth()
        .fillMaxHeight()
        .padding(10.dp)
) { 
    Row(
        modifier = Modifier
            .fillMaxWidth(),
        horizontalArrangement = Arrangement.SpaceAround
    ) {
        TextField(
            value = nameText,
            onValueChange = setNameText,
            modifier = Modifier
                .focusRequester(focusRequester)
                .onFocusChanged {
                    if (!it.isFocused) {
                        keyboardController?.hide()
                    }
                }
                .padding(horizontal = 0.dp, vertical = 0.dp)
                .height(50.dp)
                .fillMaxWidth(),
            KeyboardOptions(
                keyboardType = KeyboardType.Text,
                imeAction = androidx.compose.ui.text.input.ImeAction.Done
            ),
            keyboardActions = KeyboardActions(onDone = {
                localFocusManager.clearFocus()
            }),
            placeholder = { Text("Enter a name", fontSize = 14.sp) }
        )
    }
}

我尝试在Column中设置焦点处理程序,但不起作用(在点击外部时未调用焦点处理程序)。使用compose版本1.0.2。

1个回答

38
如果你想在轻敲时移除焦点,你可以使用 pointerInput 修饰符并将其与 detectTapGestures 添加到你的 Column 中:
Column(
    modifier = Modifier
        .fillMaxWidth()
        .fillMaxHeight()
        .padding(10.dp)
        .pointerInput(Unit) {
            detectTapGestures(onTap = {
                localFocusManager.clearFocus()
            })
        }
)

我在padding修饰符之后添加它,这样填充视图部分就不会接收到触摸。如果您改变顺序,则填充将包含在可点击部分中。

如果单击不足够,请查看其他手势


谢谢!这个解决方案在屏幕上完全正常,但在底部面板组件上却以某种方式失败了。正在努力找出可行的解决方案,解决完全后会更新! - undefined
@sud007你可以创建一个单独的问题,并在那里发布你的答案 - 然后你可以在这里的评论中留下那个答案的链接。 - undefined

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