Wenn der Nutzer den Fokus auf eine bearbeitbare Textkomponente wie TextField
legt und das Gerät eine Hardwaretastatur hat, wird die gesamte Eingabe vom System verarbeitet.
Sie können Tastenkombinationen festlegen, indem Sie Schlüsselereignisse verarbeiten.
Standard-Tastenkombinationen
Die folgenden Tastenkombinationen sind standardmäßig verfügbar.
Tastenkombination | Aktion | Composeables, die den Shortcut unterstützen |
---|---|---|
Umschalttaste + Strg + Linkspfeil/Rechtspfeil | Text bis zum Anfang/Ende des Wortes auswählen | BasicTextField , TextField |
Umschalttaste + Strg + Aufwärtspfeil / Abwärtspfeil | Text bis zum Anfang/Ende des Absatzes auswählen | BasicTextField , TextField |
Umschalttaste + Alt + Aufwärtspfeil/Abwärtspfeil oder Umschalttaste + Meta + Linkspfeil/Rechtspfeil | Text bis zum Anfang/Ende des Textes auswählen | BasicTextField , TextField |
Umschalttaste + Linkspfeil/Rechtspfeil | Zeichen auswählen | BasicTextField , TextField |
Strg + A | Alle auswählen | BasicTextField , TextField |
Strg+C/Strg+X/Strg+V | Kopieren/Ausschneiden/Einfügen | BasicTextField , TextField |
Strg + Z/Strg + Umschalttaste + Z | Rückgängig machen/Wiederholen | BasicTextField , TextField |
Bild-ab-/Bild-auf-Taste | Scrollen | LazyColumn , verticalScroll -Modifikator, scrollable -Modifikator |
Wichtige Ereignisse
In Compose können Sie für einzelne Tastenanschläge
den onKeyEvent
-Modifikator.
Der Modifikator akzeptiert eine Lambda-Funktion, die
Die geänderte Komponente empfängt ein Schlüsselereignis.
Ein Schlüsselereignis wird als KeyEvent
-Objekt beschrieben.
Sie können die Informationen zu jedem Schlüsselereignis abrufen, indem Sie im Lambda auf das Objekt verweisen, das an den onKeyEvent
-Modifikator übergeben wird.
Bei einem Tastenanschlag werden zwei Schlüsselereignisse gesendet.
Eine wird ausgelöst, wenn der Nutzer die Taste drückt, die andere, wenn er sie loslässt.
Sie können die beiden Schlüsselereignisse
durch Verweisen auf das Attribut type
des KeyEvent
-Objekts.
Der Rückgabewert der Lambda-Funktion onKeyEvent
gibt an,
ob das Schlüsselereignis verarbeitet wird oder nicht.
Geben Sie true
zurück, wenn Ihre App das Tastenereignis verarbeitet. Dadurch wird die Weiterleitung des Ereignisses verhindert.
Das folgende Snippet zeigt, wie eine doSomething()
-Funktion aufgerufen wird
wenn der Nutzer den Schlüssel S für die Komponente Box
loslässt:
Box(
modifier = Modifier.focusable().onKeyEvent {
if(
it.type == KeyEventType.KeyUp &&
it.key == Key.S
) {
doSomething()
true
} else {
false
}
}
) {
Text("Press S key")
}
Modifikatortasten
Ein KeyEvent
-Objekt hat die folgenden Attribute, die angeben,
ob Modifikatortasten gedrückt werden:
Beschreiben Sie genau, welche Schlüsselereignisse Ihre App verarbeitet.
Im folgenden Snippet wird eine doSomething()
-Funktion nur aufgerufen, wenn der Nutzer nur den S-Schlüssel loslässt.
Wenn der Nutzer eine Modifikatortaste wie die Umschalttaste drückt, ruft die App die Funktion nicht auf.
Box(
modifier = Modifier.focusable().onKeyEvent{
if(
it.type == KeyEventType.KeyUp &&
it.key == Key.S &&
!it.isAltPressed &&
!it.isCtrlPressed &&
!it.isMetaPressed &&
!it.isShiftPressed
) {
doSomething()
true
} else {
false
}
}
) {
Text("Press S key with a modifier key")
}
Klickereignisse für die Leertaste und die Eingabetaste
Auch die Leertaste und die Eingabetaste lösen Klickereignisse aus. Beispielsweise können Nutzer die Medienwiedergabe ein- oder ausschalten. mit der Leertaste oder der Eingabetaste indem Click-Events wie folgt verarbeitet werden:
MoviePlayer(
modifier = Modifier.clickable { togglePausePlay() }
)
Der clickable
-Modifikator fängt Schlüsselereignisse ab
und ruft den onClick()
-Callback auf, wenn die Leertaste oder
Die Eingabetaste wurde gedrückt.
Deshalb heißt die Funktion togglePausePlay()
indem Sie im Snippet die Leertaste oder die Eingabetaste drücken.
Nicht verwendete Schlüsselereignisse
Nicht verwendete Schlüsselereignisse werden von der Komponente weitergegeben
an der das Ereignis in der einschließenden äußeren Komponente aufgetreten ist.
Im folgenden Beispiel verbraucht die InnerComponent
Schlüsselereignisse, wenn die Taste S losgelassen wird. Die OuterComponent
erhält daher keine Schlüsselereignisse, die durch das Loslassen der Taste S ausgelöst werden.
Daher wird die Funktion actionB()
nie aufgerufen.
Andere wichtige Ereignisse auf InnerComponent
, wie das Loslassen der Taste D,
kann vom OuterComponent
verarbeitet werden.
Die Funktion actionC()
wird aufgerufen, weil das Schlüsselereignis zum Loslassen der Taste D an die OuterComponent
weitergegeben wird.
OuterComponent(
modifier = Modifier.onKeyEvent {
when {
it.type == KeyEventType.KeyUp && it.key == Key.S -> {
actionB() // This function is never called.
true
}
it.type == KeyEventType.KeyUp && it.key == Key.D -> {
actionC()
true
}
else -> false
}
}
) {
InnerComponent(
modifier = Modifier.onKeyEvent {
if(it.type == KeyEventType.KeyUp && it.key == Key.S) {
actionA()
true
} else {
false
}
}
)
}
onKeyPreviewEvent
-Modifikator
In einigen Fällen möchten Sie ein Schlüsselereignis abfangen, bevor es die Standardaktion auslöst.
Einem TextField
werden normalerweise benutzerdefinierte Verknüpfungen hinzugefügt.
Mit dem folgenden Snippet können Nutzer
zur nächsten fokussierbaren Komponente wechseln,
und drücken Sie die Tabulatortaste.
val focusManager = LocalFocusManager.current
var textFieldValue by remember { mutableStateOf(TextFieldValue()) }
TextField(
textFieldValue,
onValueChange = {
textFieldValue = it
},
modifier = Modifier.onPreviewKeyEvent {
if (it.type == KeyEventType.KeyUp && it.key == Key.Tab) {
focusManager.moveFocus(FocusDirection.Next)
true
} else {
false
}
}
)
Standardmäßig fügt die Komponente „TextField
“ ein Tabulatorzeichen
jedes Mal, wenn ein Nutzer die Tabulatortaste drückt,
selbst wenn das Schlüsselereignis mit dem onKeyEvent
-Modifikator verarbeitet wird.
Wenn Sie den Tastaturfokus verschieben möchten, ohne Tabulatorzeichen hinzuzufügen,
das Schlüsselereignis zu verarbeiten,
bevor die mit dem Schlüsselereignis verknüpften Aktionen ausgelöst werden (wie im Snippet).
Das Lambda onKeyPreviewEvent()
fängt das Schlüsselereignis ab, indem es true
zurückgibt.
Die übergeordnete Komponente kann das Schlüsselereignis abfangen, das bei ihren untergeordneten Komponenten auftritt.
Im folgenden Snippet wird die Funktion previewSKey()
aufgerufen, wenn Nutzer die Taste S drücken, anstatt die Funktion actionForPreview()
aufzurufen.
Column(
modifier = Modifier.onPreviewKeyEvent{
if(it.key == Key.S){
previewSKey()
true
}else{
false
}
}
) {
Box(
modifier = Modifier
.focusable()
.onPreviewKeyEvent {
actionForPreview(it)
false
}
.onKeyEvent {
actionForKeyEvent(it)
true
}
) {
Text("Press any key")
}
}
Das onPreviewKeyEvent()
-Lambda für die Box
-Komponente wird auch nicht ausgelöst, wenn Nutzer die Tabulatortaste drücken.
Das Lambda onPreviewKeyEvent()
wird zuerst für die übergeordnete Komponente aufgerufen,
dann wird onPreviewKeyEvent()
in der untergeordneten Komponente aufgerufen.
Auf diese Weise können Sie Tastenkombinationen auf allen Bildschirmen implementieren.
Weitere Informationen
- Hilfe zu Tastenkombinationen: Systembildschirm, auf dem Nutzer nach den Tastenkombinationen suchen können, die Ihre App bietet.