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

标签 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()
        )
    }
}
为什么在使用平板电脑的硬件键盘时无法在 fragment 中调用按键事件?

最佳答案

作为 onKeyEvent 的文档说:

will allow it to intercept hardware key events when it (or one of its children) is focused.


这意味着你需要让你的盒子聚焦,而不仅仅是聚焦。为此,您需要一个 FocusRequester ,在我的示例中,我在 View 呈现时询问焦点。在 this article 中查看更多信息
对于 future 的注释,如果用户点击文本字段,您的框将失去焦点,但 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()
}
或者,只需将内容添加到 Box所以它会拉伸(stretch)和.size不再需要修饰符
此代码适用于我的蓝牙键盘 + android 智能手机,模拟器似乎无法识别 CTRL

关于android - onKeyEvent 修饰符在 Jetpack Compose 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68861171/

相关文章:

java - 从 JSONArray 获取无名 JSON 中的特定项目

kotlin - 无法引用伴随对象方法

android - 互联网连接检查线程 Android

android - 调用 Fragment 类的方法的问题

android - 以编程方式在 LinearLayout 中插入自定义 View ,拉伸(stretch)它并使其成为正方形

spring - 使用 kotlin-spring 插件,仍然得到 class not open 错误

android - 无法导入 kotlinx.android.synthetic.main.activity_main.*

android - jetpack compose 中的滑动按钮菜单

android - Jetpack Compose 水平对齐问题

android-viewpager - 如何在 Jetpack Compose Android 中单击按钮时 ScrollView 寻呼机(伴奏库)