O suporte a teclados removíveis ajuda a maximizar a produtividade do usuário em dispositivos de tela grande. O Android aciona uma mudança de configuração sempre que um teclado é conectado ou desconectado de um dispositivo, o que pode causar uma perda do estado da interface. O app pode salvar e restaurar o estado, permitindo que o sistema processe a recriação da atividade, ou restringir a recriação da atividade para mudanças de configuração do teclado.
Em todos os casos, todos os dados relacionados ao teclado são armazenados em um Configuration
objeto. Os campos keyboard e keyboardHidden do objeto de configuração
contêm informações sobre o tipo de teclado e a disponibilidade dele.
Práticas recomendadas
Os apps otimizados para telas grandes oferecem suporte a todos os tipos de dispositivos de entrada, desde teclados de software e hardware até stylus, mouse, trackpad e outros periféricos.
O suporte a teclados externos envolve mudanças de configuração, que podem ser gerenciadas de duas maneiras:
- Permita que o sistema recrie a atividade em execução e cuide do gerenciamento do estado do app.
- Gerencie a mudança de configuração por conta própria (a atividade não será recriada):
- Declare todos os valores de configuração relacionados ao teclado.
- Crie um gerenciador de mudanças de configuração.
Os apps de produtividade, que geralmente exigem controle refinado da interface para entrada de texto e outras entradas, podem se beneficiar da abordagem "faça você mesmo" para processar mudanças de configuração.
Em casos especiais, talvez você queira mudar o layout do app quando um teclado de hardware for conectado ou desconectado, por exemplo, para criar mais espaço para ferramentas ou janelas de edição.
No Jetpack Compose, é possível reagir a mudanças de configuração do teclado de duas maneiras:
- Interface reativa:leia o estado de configuração atual diretamente nos elementos combináveis usando
LocalConfiguration.current. A interface é recomposta automaticamente para se adaptar ao novo estado quando um teclado é conectado ou desconectado. - Callback de efeito colateral:use um
DisposableEffectcom reconhecimento do ciclo de vida para registrar um listener de mudança de configuração na atividade do host, que permite acionar eventos não relacionados à interface (como registro ou análise) sem recriar a atividade ou instanciar elementos de visualização fictícios.
Ingredientes
android:configChanges: atributo do elemento<activity>do manifesto do app. Informa o sistema sobre as mudanças de configuração que o app gerencia.LocalConfiguration: provedor local combinável que expõe o dispositivoConfiguration.DisposableEffect: API de efeito colateral do Compose que executa um bloco de código quando um elemento combinável entra na composição e limpa quando ele sai.
Etapas
Declare o atributo configChanges e adicione valores relacionados ao teclado para evitar a recriação da atividade. Em seguida, use LocalConfiguration.current para adaptar dinamicamente o layout combinável ou registre um listener de configuração usando DisposableEffect.
1. Declarar o atributo configChanges
Atualize o elemento <activity> no manifesto do app adicionando os
keyboard|keyboardHidden valores à lista de mudanças de configuração já gerenciadas:
<activity
…
android:configChanges="...|keyboard|keyboardHidden">
2. Responder a mudanças de configuração do teclado
Para processar mudanças de configuração no Jetpack Compose, use uma das seguintes opções, dependendo se você está atualizando a interface ou executando um callback de efeito colateral:
Opção A: interface reativa (recomendada)
Leia o tipo de teclado diretamente de
LocalConfiguration.current. Quando um teclado de hardware é conectado ou desconectado, esse valor muda, e o Compose recomponha automaticamente a interface.val configuration = LocalConfiguration.current val isPhysicalKeyboardAttached = configuration.keyboard == Configuration.KEYBOARD_QWERTY if (isPhysicalKeyboardAttached) { // Render layout optimized for physical keyboard } else { // Render default layout }
Opção B: listener de efeito colateral
Se você precisar executar um efeito colateral (como registro, atualização de um banco de dados local ou acionamento de análises) quando a configuração mudar, use um
DisposableEffectpara registrar um listener de mudança de configuração noComponentActivitydo host.val context = LocalActivity.current DisposableEffect(context) { val activity = context as? ComponentActivity val listener = Consumer<Configuration> { newConfig -> val hasKeyboard = newConfig.keyboard == Configuration.KEYBOARD_QWERTY // Trigger non-UI actions, analytics, etc. } activity?.addOnConfigurationChangedListener(listener) onDispose { activity?.removeOnConfigurationChangedListener(listener) } }
Resultados
O app agora vai responder a um teclado externo conectado ou desconectado sem recriar a atividade em execução.
Outros recursos
Para saber como salvar o estado da interface do app durante mudanças de configuração, como conexão ou desconexão do teclado, consulte Salvar estados da interface.