android - 如何在关闭键盘时清除 TextField 焦点并防止在 Jetpack Compose 中退出应用程序所需的两次后按?

标签 android android-jetpack-compose android-jetpack-compose-text

我正在使用 BasicTextField。
当我开始编辑时,后退按钮变为隐藏键盘按钮(向下箭头)。
首先按下后退按钮隐藏键盘,但焦点仍在文本字段上。两个onFocusChangedBackPressHandler处理程序没有被调用。
第二次按下后退按钮清除焦点:onFocusChanged被调用并且BackPressHandler不是。

BackHandler {
    println("BackPressHandler")
}
val valueState = remember { mutableStateOf(TextFieldValue(text = "")) }
BasicTextField(
    value = valueState.value,
    onValueChange = {
        valueState.value = it
    },
    modifier = Modifier
        .fillMaxWidth()
        .onFocusChanged {
            println("isFocused ${it.isFocused}")
        }
)
第三次 BackHandler 工作正常。只是用于测试,我不应该在这里需要它,它预计在第一次后退按钮点击后焦点会丢失

最佳答案

有一个compose issue带有焦点文本字段可防止后退按钮在键盘隐藏时关闭应用程序。它被标记为已修复,但将包含在某些 future 版本中,而不是 1.0但是,据我了解,在键盘被关闭后文本字段没有失去焦点的事实是 Android 上的预期行为(因为可能连接了键盘?我没有得到原因)。这也是它在旧的 android 布局中的工作方式
这对我来说似乎很奇怪,所以我使用了以下修饰符,当键盘消失时它会放弃焦点:

fun Modifier.clearFocusOnKeyboardDismiss(): Modifier = composed {
    var isFocused by remember { mutableStateOf(false) }
    var keyboardAppearedSinceLastFocused by remember { mutableStateOf(false) }
    if (isFocused) {
        val imeIsVisible = LocalWindowInsets.current.ime.isVisible
        val focusManager = LocalFocusManager.current
        LaunchedEffect(imeIsVisible) {
            if (imeIsVisible) {
                keyboardAppearedSinceLastFocused = true
            } else if (keyboardAppearedSinceLastFocused) {
                focusManager.clearFocus()
            }
        }
    }
    onFocusEvent {
        if (isFocused != it.isFocused) {
            isFocused = it.isFocused
            if (isFocused) {
                keyboardAppearedSinceLastFocused = false
            }
        }
    }
}
p.s.您需要安装accompanist insets LocalWindowInsets.current.ime 的依赖项
p.s.s. Since撰写 1.2.0-alpha03 , 伴奏插图 大部分被移入 撰写基金会 , 查看 migration guide更多细节。 LocalWindowInsets.current.ime应替换为 WindowInsets.ime .

用法:
BasicTextField(
    value = valueState.value,
    onValueChange = {
        valueState.value = it
    },
    modifier = Modifier
        .clearFocusOnKeyboardDismiss()
)

关于android - 如何在关闭键盘时清除 TextField 焦点并防止在 Jetpack Compose 中退出应用程序所需的两次后按?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68389802/

相关文章:

android - Jetpack Compose 如何将特定大小的文本组件的文本或内容与左下角或右下角对齐?

android - Gradle:在库项目中找不到actionbarsherlock @aar

android - 如何找到在 Android softKeyboard 上按下的是哪个键?

android - 将 Jetpack-Compose 添加到项目使用 API below 21

kotlin - 如何防止用户在文本字段中输入两个点jetpack compose

android - 在 Jetpack Compose 中按字体的上升而不是基线对齐两个文本

android - 如何在React原生sqlite数据库中使用upsert

android - onRequestPermissionsResult 未触发覆盖权限

android - jetpack compose 中的 onNewIntent