onKeyEvent 修饰符在 Jetpack Compose 中不起作用

Lin*_* Li 10 android kotlin android-jetpack-compose

return ComposeView(requireContext()).apply {
    setContent {
        Box(
            Modifier
                .onKeyEvent {
                    if (it.isCtrlPressed && it.key == Key.A) {
                        println("Ctrl + A is pressed")
                        true
                    } else {
                        false
                    }
                }
                .focusable()
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么使用平板硬件键盘时无法在fragment中调用按键事件?

Phi*_*hov 11

正如文档所说onKeyEvent

将允许它在它(或其子级之一)聚焦时拦截硬件按键事件。

这意味着你需要让你的盒子聚焦,而不仅仅是可聚焦。为此,您需要一个FocusRequester,在我的示例中,我在视图呈现时询问焦点。查看本文中的更多内容

对于未来的说明,如果用户点击文本字段,您的框将失去焦点,但onKeyEvent如果此 txt 字段位于框内,则仍然可以工作

看起来空框无法获得焦点,因此您需要使用修饰符添加一些大小。它仍然是不可见的:

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

或者,只需添加内容Box即可拉伸,并且.size不再需要修改器

此代码适用于我的蓝牙键盘 + Android 智能手机,模拟器似乎无法识别CTRL