2

我将使用 Kotlin Jetpack Compose 开发一个 POS 系统,我想知道如何在我的项目中触发键盘输入事件。

4

2 回答 2

3

onKeyEvent Window在 Compose Desktop 中,您可以使用参数监听关键事件:

Window(
    onCloseRequest = ::exitApplication,
    visible = visible,
    onKeyEvent = {
        if (it.isCtrlPressed && it.key == Key.A) {
            println("Ctrl + A is pressed")
            true
        } else {
            // let other handlers receive this event
            false
        }
    }
) {
    App()
}

另一个同样适用于 Android 中 Compose 的选项是使用Modifier.onKeyEvent。正如文件所说:

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

因此,您需要使一个项目或它的一个子项目具有焦点和焦点。在本文中查看有关撰写中焦点的更多信息

为此,您需要一个FocusRequester,在我的示例中,我在使用LaunchedEffect.

对于未来的注释,如果用户点击文本字段,或者其他可聚焦元素将获得焦点,您的视图将失去它。如果这个焦点视图在你的视图中onKeyEvent,它仍然可以工作。

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

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

或者,只需添加内容,Box这样它就会拉伸并且.size不再需要修改器

于 2021-09-03T06:31:58.357 回答
0

当您设置焦点并出于某种原因单击应用程序窗口内部时,遵循菲利普答案的第二个选项可能会出现奇怪的行为。这样做可能会“失去”焦点,并且关键事件没有得到妥善处理。

为了避免这种情况,建议通过添加单击/点击修饰符手动处理此问题,该修饰符仅指定当检测到单击/点击时requester再次请求焦点。见下文:

val requester = FocusRequester()
  Box(
    Modifier
       //pointer input handles [onPress] to force focus to the [requester]
      .pointerInput(key1 = true) {
        detectTapGestures(onPress = {
          requester.requestFocus()
        })
      }
      .onKeyEvent {
        if (it.isCtrlPressed && it.key == Key.A) {
          println("Ctrl + A is pressed")
          true
        } else {
          // let other handlers receive this event
          false
        }
      }
      .focusRequester(requester)
      .focusable()
      .fillMaxSize()
      .background(Color.Cyan)
  )
  LaunchedEffect(Unit) {
    requester.requestFocus()
  }
于 2021-11-10T23:14:05.103 回答