Как активировать ввод с клавиатуры ПК в Kotlin Desktop Compose
Я собираюсь разработать POS-систему с использованием Kotlin Jetpack Compose, и я хочу знать, как запускать события ввода с клавиатуры внутри моего проекта.
2 ответа
Вы также можете использовать , как говорится в документации:
позволит ему перехватывать события аппаратных клавиш, когда он (или один из его дочерних элементов) находится в фокусе.
Итак, вам нужно сделать предмет или одного из его дочерних элементов сфокусированными и сфокусированными. Узнайте больше о фокусировке в сочинении в модификатор ключевого событияэтой статье
Для этого вам понадобится
FocusRequester
, в моем примере я прошу сфокусироваться, когда представление визуализируется с использованием
LaunchedEffect
.
На будущее обратите внимание, что если пользователь нажимает на текстовое поле, или другой фокусируемый элемент получит фокус, ваше представление потеряет его. Если это сфокусированное представление находится внутри вашего представления с
onKeyEvent
обработчик, это все равно будет работать.
Пустое поле не может стать сфокусированным, поэтому вам нужно добавить какой-то размер с помощью модификатора. Он по-прежнему будет невидимым:
val requester = 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
модификатор больше не понадобится
Следуя второму варианту ответа Филиппа, можно получить странное поведение, когда вы устанавливаете фокус и по какой-то причине щелкаете внутри окна приложения. При этом возможно «потерять» фокус, а ключевые события не обрабатываются должным образом.
Чтобы избежать этого, предлагается вручную решить эту проблему, добавив модификатор щелчка/нажатия, который просто указывает, что при обнаружении щелчка/нажатия
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()
}