Quando o usuário dá foco a um componente de texto editável, como um TextField
,
e o dispositivo tem um teclado físico conectado,
toda a entrada é processada pelo sistema.
Você pode fornecer atalhos do teclado processando eventos de tecla.
Atalhos de teclado padrão
Os atalhos de teclado a seguir já estão disponíveis.
Atalho do teclado | Ação | Elementos combináveis com suporte ao atalho |
---|---|---|
Shift+Ctrl+seta para a esquerda/seta para a direita | Selecionar o texto até o início/fim da palavra | BasicTextField , TextField |
Shift+Ctrl+Seta para cima/Seta para baixo | Selecionar o texto até o início/fim do parágrafo | BasicTextField , TextField |
Shift+Alt+seta para cima/seta para baixo ou Shift+Meta+seta para a esquerda/seta para a direita | Selecionar o texto até o início/fim do texto | BasicTextField , TextField |
Shift + seta para a esquerda/seta para a direita | Selecionar caracteres | BasicTextField , TextField |
Ctrl+A | Selecionar tudo | BasicTextField , TextField |
Ctrl+C/Ctrl+X/Ctrl+V | Copiar/recortar/colar | BasicTextField , TextField |
Ctrl+Z/Ctrl+Shift+Z | Desfazer/refazer | BasicTextField , TextField |
PageDown/PageUp | Rolagem | LazyColumn , o modificador verticalScroll , o modificador scrollable |
Eventos principais
No Compose, é possível processar uma tecla individual com
o modificador onKeyEvent
.
O modificador aceita uma lambda chamada
quando o componente modificado recebe um evento de tecla.
Um evento principal é descrito como um objeto KeyEvent
.
Para ver as informações de cada evento principal, consulte o objeto
na lambda transmitida ao modificador onKeyEvent
.
Um pressionamento de tecla envia dois eventos de tecla.
Um é acionado quando o usuário pressiona a tecla.
o outro é acionado quando a chave é liberada.
É possível diferenciar os dois eventos principais
consultando o atributo type
do objeto KeyEvent
.
O valor de retorno da lambda onKeyEvent
indica
se o evento de tecla é tratado ou não.
Retorne true
se o app processar o evento de tecla.
que interrompe a propagação do evento.
O snippet a seguir mostra como chamar uma função doSomething()
quando o usuário libera a tecla S no componente Box
:
Box(
modifier = Modifier.focusable().onKeyEvent {
if(
it.type == KeyEventType.KeyUp &&
it.key == Key.S
) {
doSomething()
true
} else {
false
}
}
) {
Text("Press S key")
}
Teclas modificadoras
Um objeto KeyEvent
tem os seguintes atributos, que indicam
se as teclas modificadoras estão pressionadas ou não:
Descreva de maneira específica os eventos principais processados pelo app.
O snippet a seguir chama uma função doSomething()
somente se o usuário soltar apenas a tecla S.
Se o usuário pressionar qualquer tecla modificadora,
como a tecla Shift, o app não vai chamar a função.
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")
}
Eventos de clique da tecla "Enter" e da barra de espaço
A barra de espaço e a tecla Enter também acionam eventos de clique. Por exemplo, os usuários podem alternar (reproduzir ou pausar) a reprodução de mídia com a barra de espaço ou a tecla Enter ao processar eventos de clique da seguinte maneira:
MoviePlayer(
modifier = Modifier.clickable { togglePausePlay() }
)
O modificador clickable
intercepta eventos de tecla
e chama o callback onClick()
quando a tecla Spacebar ou
Enter é pressionada.
É por isso que a função togglePausePlay()
é chamada
pressionando a barra de espaço ou a tecla Enter no snippet.
Eventos principais não consumidos
Os eventos principais não consumidos são propagados para o componente
onde o evento ocorreu ao componente externo que o contém.
No exemplo abaixo, o InnerComponent
consome eventos principais
quando a chave S é liberada.
Assim, o OuterComponent
não recebe nenhum evento principal acionado
ao liberar a chave S.
É por isso que a função actionB()
nunca é chamada.
Outros eventos de tecla em InnerComponent
, como a liberação da tecla D,
podem ser processados pelo OuterComponent
.
A função actionC()
é chamada porque o evento de tecla para
liberar a tecla D é propagado para o 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
}
}
)
}
Modificador onKeyPreviewEvent
Em alguns casos de uso, você quer interceptar um evento de tecla
antes de acionar a ação padrão.
Adicionar atalhos personalizados a um TextField
é muito comum.
O snippet a seguir permite que os usuários passem para o próximo componente com foco
pressionando a tecla tab.
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
}
}
)
Por padrão, o componente TextField
adiciona um caractere de tabulação
sempre que os usuários pressionam a tecla Tab,
mesmo que o evento de tecla seja processado com o modificador onKeyEvent
.
Para mover o foco do teclado sem adicionar caracteres de tabulação,
processe o evento de tecla
antes de acionar as ações associadas a ele, como no snippet.
A lambda onKeyPreviewEvent()
intercepta o evento de tecla
retornando true
.
O componente pai pode interceptar o evento de tecla que acontece nos filhos.
No snippet abaixo, a função previewSKey()
é chamada
quando os usuários pressionam a tecla S,
em vez de chamar a função 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")
}
}
O lambda onPreviewKeyEvent()
do componente Box
também não é acionado
quando os usuários pressionam a tecla Tab.
A lambda onPreviewKeyEvent()
é chamada primeiro no componente pai.
então, onPreviewKeyEvent()
no componente filho é chamado.
Use esse comportamento para implementar atalhos de teclado na tela inteira.
Outros recursos
- Auxiliar de atalhos do teclado: tela do sistema que permite que os usuários pesquisem os atalhos do teclado oferecidos pelo app.