Как считывать нажатия клавиш в Kotlin: консоль и Android

Короткий ответ: в обычном консольном 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. Для соседних задач пригодятся эти разборы:

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x