Lorsque l'utilisateur sélectionne un composant texte modifiable, comme TextField
,
et l'appareil dispose d'un
clavier matériel connecté,
toutes les entrées sont gérées par le système.
Vous pouvez fournir des raccourcis clavier en gérant les événements de touche.
Raccourcis clavier par défaut
Les raccourcis clavier suivants sont prêts à l'emploi.
Raccourci clavier | Action | Composables compatibles avec le raccourci |
---|---|---|
Maj+Ctrl+Flèche vers la gauche/droite | Sélectionner du texte jusqu'au début/à la fin du mot | BasicTextField , TextField |
Maj+Ctrl+Flèche vers le haut/Flèche vers le bas | Sélectionner le texte au début/à la fin du paragraphe | BasicTextField , TextField |
Maj+Alt+Flèche vers le haut/Flèche vers le bas ou Maj+Méta+Flèche vers la gauche/Flèche vers la droite | Sélectionner du texte jusqu'au début/à la fin du texte | BasicTextField , TextField |
Maj+Flèche vers la gauche/droite | Sélectionner des caractères | BasicTextField , TextField |
Ctrl+A | Tout sélectionner | BasicTextField , TextField |
Ctrl+C/Ctrl+X/Ctrl+V | Copier/couper/Coller | BasicTextField , TextField |
Ctrl+Z/Ctrl+Maj+Z | Annuler/Rétablir | BasicTextField , TextField |
Page suivante/Page précédente | Faire défiler | LazyColumn , le modificateur verticalScroll , le modificateur scrollable |
Événements clés
Dans Compose, vous pouvez gérer une frappe individuelle avec le modificateur onKeyEvent
.
Le modificateur accepte un lambda appelé lorsque le composant modifié reçoit un événement de touche.
Un événement clé est décrit comme un objet KeyEvent
.
Vous pouvez obtenir les informations de chaque événement de touche en vous référant à l'objet dans le lambda transmis au modificateur onKeyEvent
.
Une frappe envoie deux événements de touche.
L'un est déclenché lorsque l'utilisateur appuie sur la touche, et l'autre lorsque la touche est relâchée.
Vous pouvez distinguer les deux événements clés en vous référant à l'attribut type
de l'objet KeyEvent
.
La valeur renvoyée par le lambda onKeyEvent
indique
si l'événement clé
est géré ou non.
Renvoyez true
si votre application gère l'événement clé.
ce qui arrête la propagation de l'événement.
L'extrait de code suivant montre comment appeler une fonction doSomething()
Lorsque l'utilisateur libère la clé S sur le composant Box
:
Box(
modifier = Modifier.focusable().onKeyEvent {
if(
it.type == KeyEventType.KeyUp &&
it.key == Key.S
) {
doSomething()
true
} else {
false
}
}
) {
Text("Press S key")
}
Touches de modification
Un objet KeyEvent
possède les attributs suivants, qui indiquent
l'appui sur les touches de modification:
Décrivez précisément les événements clés gérés par votre application.
L'extrait de code suivant appelle une fonction doSomething()
uniquement si l'utilisateur libère uniquement la clé S.
Si l'utilisateur appuie sur une touche modificateur, telle que la touche Maj, l'application n'appelle pas la fonction.
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")
}
Barre d'espace et Entrée des événements de clic clé
Les touches Barre d'espace et Entrée déclenchent également des événements de clic. Par exemple, les utilisateurs peuvent lire ou mettre en pause la lecture des contenus multimédias. avec la barre d'espace ou la touche Entrée. en gérant les événements de clic comme suit:
MoviePlayer(
modifier = Modifier.clickable { togglePausePlay() }
)
Le modificateur clickable
intercepte les événements de touche.
et appelle le rappel onClick()
lorsque la barre d'espace ou
la touche Entrée est enfoncée.
C'est pourquoi la fonction togglePausePlay()
est appelée
en appuyant sur la barre d'espace ou sur la touche Entrée dans l'extrait.
Événements clés non consommés
Les événements de touche non consommés sont propagés du composant où l'événement s'est produit au composant externe englobant.
Dans l'exemple ci-dessous, InnerComponent
utilise des événements clés
lorsque la touche S est relâchée,
Ainsi, OuterComponent
ne reçoit aucun événement clé déclenché.
en relâchant la touche S.
C'est pourquoi la fonction actionB()
n'est jamais appelée.
Autres événements clés sur InnerComponent
, tels que la libération de la touche D
peuvent être gérées par OuterComponent
.
La fonction actionC()
est appelée, car l'événement clé pour
la libération de la clé D est propagée à OuterComponent
.
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
}
}
)
}
Modificateur onKeyPreviewEvent
Dans certains cas d'utilisation, vous souhaitez intercepter un événement clé
avant de déclencher l'action par défaut.
L'ajout de raccourcis personnalisés à un TextField
est un exemple typique.
L'extrait de code suivant permet aux utilisateurs de passer au composant suivant pouvant recevoir la sélection en appuyant sur la touche Tabulation.
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
}
}
)
Par défaut, le composant TextField
ajoute un caractère de tabulation
chaque fois que les utilisateurs appuient sur la touche Tabulation,
même si l'événement de touche est géré avec le modificateur onKeyEvent
.
Pour déplacer le curseur au clavier sans ajouter de caractères de tabulation,
gérer l'événement clé
avant de déclencher les actions associées à l'événement clé, comme dans l'extrait.
Le lambda onKeyPreviewEvent()
intercepte l'événement clé.
en renvoyant true
.
Le composant parent peut intercepter l'événement clé qui se produit sur ses enfants.
Dans l'extrait de code suivant, la fonction previewSKey()
est appelée lorsque les utilisateurs appuient sur la touche S, au lieu d'appeler la fonction actionForPreview()
.
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")
}
}
Le lambda onPreviewKeyEvent()
pour le composant Box
n'est pas déclenché
lorsque les utilisateurs appuient sur la touche Tabulation.
Le lambda onPreviewKeyEvent()
est d'abord appelé sur le composant parent, puis onPreviewKeyEvent()
dans le composant enfant.
Vous pouvez implémenter des raccourcis clavier à l'échelle de l'écran en utilisant ce comportement.
Ressources supplémentaires
- Outil d'aide pour les raccourcis clavier : écran système qui permet aux utilisateurs de rechercher les raccourcis clavier proposés par votre application.