Короткий ответ: в обычном консольном Kotlin проще читать строку через readln(). Если нужны именно отдельные нажатия клавиш без Enter, это уже зависит от платформы: JVM-консоль, Android, Desktop или игра. Для Android Compose используют Modifier.onKeyEvent
Ввод в консоли
Самый простой пример:
fun main() {
print("Введите команду: ")
val command = readln()
println("Вы ввели: $command")
}
Пользователь вводит текст и нажимает Enter. Для многих учебных задач этого достаточно: меню, калькулятор, выбор действия, простая игра в консоли
Проверка одной команды
fun main() {
print("Нажмите w, a, s или d: ")
val input = readln().trim().lowercase()
when (input) {
"w" -> println("Вверх")
"a" -> println("Влево")
"s" -> println("Вниз")
"d" -> println("Вправо")
else -> println("Неизвестная команда")
}
}
Это не «живое» считывание клавиши, потому что нужен Enter. Но для первого Kotlin-примера такой вариант понятнее и надежнее
Android Compose: onKeyEvent
Если вы делаете Android-экран и хотите ловить клавиши с физической клавиатуры, можно использовать onKeyEvent
@Composable
fun KeyScreen() {
var lastKey by remember { mutableStateOf("пока нет") }
Box(
modifier = Modifier
.fillMaxSize()
.focusable()
.onKeyEvent { event ->
lastKey = event.key.toString()
true
}
) {
Text("Последняя клавиша: $lastKey")
}
}
Важно: элемент должен получить фокус. Без focusable() или явного управления фокусом событие может не прийти
Как проверить
Для консоли запустите программу, введите w, нажмите Enter и проверьте вывод Вверх
Для Android подключите физическую клавиатуру к эмулятору или используйте устройство с клавиатурой. Нажмите клавишу и посмотрите, меняется ли текст на экране
Если вы делаете игру
Для игры или интерактивного приложения лучше не строить управление на readln(). Пользователь ожидает мгновенную реакцию, а не ввод команды с Enter. В этом случае выбирайте платформу и ее инструменты: Android key events, Compose Desktop, libGDX или другой игровой слой
Сама идея остается той же: событие клавиши приходит из платформы, а Kotlin-код уже решает, что делать с этим событием
when (keyName) {
"W" -> moveUp()
"A" -> moveLeft()
"S" -> moveDown()
"D" -> moveRight()
}
Такой псевдокод помогает отделить обработку ввода от игровой логики
Частые ошибки
Ждать мгновенного нажатия в readln
readln() ждет строку до Enter. Это нормальное поведение консольного ввода
Писать одну логику для всех платформ
Kotlin — язык, а ввод клавиш предоставляет платформа. Android, JVM-консоль и Desktop решают эту задачу по-разному
Забыть фокус в Compose
Если onKeyEvent не работает, сначала проверьте, может ли элемент получить фокус
Что почитать дальше по Kotlin
Если нужен общий маршрут по теме, откройте рубрику Kotlin. Для соседних задач пригодятся эти разборы:
- Kotlin Android: первый экран без перегруза
- UUID Android-устройства в Kotlin ViewModel: как получить безопасно
- Как в Android Studio поменять Kotlin на Java
- Как воспроизвести аудио на Kotlin в Android Studio



