KeyEvent


When a user presses a key on a hardware keyboard, a KeyEvent is sent to the item that is currently focused. Any parent composable can intercept this key event on its way to the focused item by using Modifier.onPreviewKeyEvent()]onPreviewKeyEvent. If the item is not consumed, it returns back to each parent and can be intercepted by using Modifier.onKeyEvent()]onKeyEvent.

import androidx.compose.foundation.focusable
import androidx.compose.foundation.layout.Box
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onKeyEvent
import androidx.compose.ui.input.key.onPreviewKeyEvent

// When the inner Box is focused, and the user presses a key, the key goes down the hierarchy
// and then back up to the parent. At any stage you can stop the propagation by returning
// true to indicate that you consumed the event.
Box(Modifier.onPreviewKeyEvent { keyEvent1 -> false }.onKeyEvent { keyEvent4 -> false }) {
    Box(
        Modifier.onPreviewKeyEvent { keyEvent2 -> false }
            .onKeyEvent { keyEvent3 -> false }
            .focusable()
    )
}

Summary

Public constructors

KeyEvent(nativeKeyEvent: NativeKeyEvent)
Cmn

Public properties

NativeKeyEvent
Cmn

Extension properties

Boolean

Indicates whether the Alt key is pressed.

Cmn
android
Boolean

Indicates whether the Ctrl key is pressed.

Cmn
android
Boolean

Indicates whether the Meta key is pressed.

Cmn
android
Boolean

Indicates whether the Shift key is pressed.

Cmn
android
Key

The key that was pressed.

Cmn
android
KeyEventType

The type of key event.

Cmn
android
Int

The UTF16 value corresponding to the key event that was pressed.

Cmn
android

Public constructors

KeyEvent

KeyEvent(nativeKeyEvent: NativeKeyEvent)

Public properties

nativeKeyEvent

val nativeKeyEventNativeKeyEvent

Extension properties

isAltPressed

val KeyEvent.isAltPressedBoolean

Indicates whether the Alt key is pressed.

import androidx.compose.foundation.focusable
import androidx.compose.foundation.layout.Box
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.isAltPressed
import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onKeyEvent

Box(
    Modifier.onKeyEvent {
            if (it.isAltPressed && it.key == Key.A) {
                println("Alt + A is pressed")
                true
            } else {
                false
            }
        }
        .focusable()
)

isCtrlPressed

val KeyEvent.isCtrlPressedBoolean

Indicates whether the Ctrl key is pressed.

import androidx.compose.foundation.focusable
import androidx.compose.foundation.layout.Box
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.isCtrlPressed
import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onKeyEvent

Box(
    Modifier.onKeyEvent {
            if (it.isCtrlPressed && it.key == Key.A) {
                println("Ctrl + A is pressed")
                true
            } else {
                false
            }
        }
        .focusable()
)

isMetaPressed

val KeyEvent.isMetaPressedBoolean

Indicates whether the Meta key is pressed.

import androidx.compose.foundation.focusable
import androidx.compose.foundation.layout.Box
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.isMetaPressed
import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onKeyEvent

Box(
    Modifier.onKeyEvent {
            if (it.isMetaPressed && it.key == Key.A) {
                println("Meta + A is pressed")
                true
            } else {
                false
            }
        }
        .focusable()
)

isShiftPressed

val KeyEvent.isShiftPressedBoolean

Indicates whether the Shift key is pressed.

import androidx.compose.foundation.focusable
import androidx.compose.foundation.layout.Box
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.isShiftPressed
import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onKeyEvent

Box(
    Modifier.onKeyEvent {
            if (it.isShiftPressed && it.key == Key.A) {
                println("Shift + A is pressed")
                true
            } else {
                false
            }
        }
        .focusable()
)

key

val KeyEvent.keyKey

The key that was pressed.

import androidx.compose.foundation.focusable
import androidx.compose.foundation.layout.Box
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.isAltPressed
import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onKeyEvent

Box(
    Modifier.onKeyEvent {
            if (it.isAltPressed && it.key == Key.A) {
                println("Alt + A is pressed")
                true
            } else {
                false
            }
        }
        .focusable()
)

type

val KeyEvent.typeKeyEventType

The type of key event.

import androidx.compose.foundation.focusable
import androidx.compose.foundation.layout.Box
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.KeyEventType.Companion.KeyDown
import androidx.compose.ui.input.key.KeyEventType.Companion.KeyUp
import androidx.compose.ui.input.key.KeyEventType.Companion.Unknown
import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onKeyEvent
import androidx.compose.ui.input.key.type

Box(
    Modifier.onKeyEvent {
            when (it.type) {
                KeyUp -> println("KeyUp Pressed")
                KeyDown -> println("KeyUp Pressed")
                Unknown -> println("Unknown key type")
                else -> println("New KeyType (for future use)")
            }
            false
        }
        .focusable()
)

utf16CodePoint

val KeyEvent.utf16CodePointInt

The UTF16 value corresponding to the key event that was pressed. The unicode character takes into account any meta keys that are pressed (eg. Pressing shift results in capital alphabets). The UTF16 value uses the U+n notation[http://www.unicode.org/reports/tr27/#notation] of the Unicode Standard.

An Int is used instead of a Char so that we can support supplementary characters. The Unicode Standard allows for characters whose representation requires more than 16 bits. The range of legal code points is U+0000 to U+10FFFF, known as Unicode scalar value.

The set of characters from U+0000 to U+FFFF is sometimes referred to as the Basic Multilingual Plane (BMP). Characters whose code points are greater than U+FFFF are called supplementary characters. In this representation, supplementary characters are represented as a pair of char values, the first from the high-surrogates range, (\uD800-\uDBFF), the second from the low-surrogates range (\uDC00-\uDFFF).