Jetpack Compose - onKeyEvent не может работать в Android 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()
                )
           
            }
        }

почему ключевое событие нельзя вызвать фрагментарно при использовании аппаратной клавиатуры планшета.

2 ответа

Как говорится в документации:

позволит ему перехватывать события аппаратных клавиш, когда он (или один из его дочерних элементов) находится в фокусе.

Это означает, что вам нужно сделать вашу коробку сфокусированной, а не просто сфокусированной. Для этого вам понадобится FocusRequesterв моем примере я спрашиваю фокус при рендеринге представления. Узнайте больше в этой статье

На будущее обратите внимание, что если пользователь нажимает на текстовое поле, ваше поле теряет фокус, но onKeyEvent все равно будет работать, если это поле txt находится внутри коробки

Похоже, пустое поле не может быть сфокусировано, поэтому вам нужно добавить размер с помощью модификатора. Он по-прежнему будет невидимым:

      val requester = 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 модификатор больше не понадобится

Этот код отлично работает с моей клавиатурой Bluetooth + смартфоном Android, эмулятор не распознает CTRL

Если вы используетеandroidx.compose.material3.OutlinedTextFieldтогда вы можете использоватьKeyboardActionsвместо:

      keyboardActions = KeyboardActions(onDone = { /* Do something */ })
Другие вопросы по тегам