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 */ })