android 编写文本字段如何在外部触摸时关闭键盘

srv*_*rvy 16 android android-jetpack-compose

这是一个在全屏列中包含 TextField 的行。onFocusChanged当点击文本字段(进入活动状态)以及按下键盘上的“完成”按钮时,将调用回调。但当我在 TextField 外部点击时,处理程序不会被调用。所以我无法关闭键盘。任何想法?

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) }
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Phi*_*hov 38

如果您想删除点击焦点,您可以将pointerInput修饰符添加detectTapGestures到您的Column

Column(
    modifier = Modifier
        .fillMaxWidth()
        .fillMaxHeight()
        .padding(10.dp)
        .pointerInput(Unit) {
            detectTapGestures(onTap = {
                localFocusManager.clearFocus()
            })
        }
)
Run Code Online (Sandbox Code Playgroud)

我将其添加在padding修饰符之后,因此填充视图部分不会接收触摸。如果更改顺序,可点击部分中将包含填充。

如果点击对您来说还不够,请查看其他手势。