android onKeyEvent修饰符在Jetpack合成中不起作用

zlhcx6iw  于 2023-03-16  发布在  Android
关注(0)|答案(2)|浏览(225)
return ComposeView(requireContext()).apply {
    setContent {
        Box(
            Modifier
                .onKeyEvent {
                    if (it.isCtrlPressed && it.key == Key.A) {
                        println("Ctrl + A is pressed")
                        true
                    } else {
                        false
                    }
                }
                .focusable()
        )
    }
}

为什么在使用平板电脑硬件键盘时,按键事件不能分片调用?

83qze16e

83qze16e1#

正如onKeyEvent的文档所述:
将允许它在它(或其子项之一)获得焦点时拦截硬件按键事件。
这意味着你需要让你的框聚焦,而不仅仅是可聚焦。要做到这一点,你需要一个FocusRequester,在我的例子中,我要求焦点时,视图呈现。
对于未来的注意事项,如果用户点击文本字段,您的框将失去焦点,但如果此txt字段在框内,onKeyEvent仍将工作
看起来空框不能聚焦,所以你需要用修饰符添加一些大小。它仍然是不可见的:

val requester = remember { FocusRequester() }
Box(
    Modifier
        .onKeyEvent {
            if (it.isCtrlPressed && it.key == Key.A) {
                println("Ctrl + A is pressed")
                true
            } else {
                false
            }
        }
        .focusRequester(requester)
        .focusable()
        .size(10.dp)
)
LaunchedEffect(Unit) {
    requester.requestFocus()
}

或者,只需向Box添加内容,使其拉伸,不再需要.size修饰符
此代码与我的蓝牙键盘+ Android智能手机工作正常,模拟器似乎无法识别CTRL

6qftjkof

6qftjkof2#

如果您使用的是androidx.compose.material3.OutlinedTextField,则可以改用KeyboardActions

keyboardActions = KeyboardActions(onDone = { /* Do something */ })

相关问题