La compatibilidad con teclados desmontables ayuda a maximizar la productividad del usuario en dispositivos con pantalla grande. Android activa un cambio de configuración cada vez que se conecta o desconecta un teclado a un dispositivo, lo que puede provocar la pérdida del estado de la IU. Tu app puede guardar y restablecer su estado, lo que permite que el sistema controle la recreación de la actividad, o bien restringir la recreación de la actividad para los cambios de configuración del teclado.
En todos los casos, todos los datos relacionados con el teclado se almacenan en un Configuration
objeto. Los campos keyboard y keyboardHidden del objeto de configuración
contienen información sobre el tipo de teclado y su disponibilidad.
Prácticas recomendadas
Las apps optimizadas para pantallas grandes admiten todo tipo de dispositivos de entrada, desde teclados de software y hardware hasta plumas stylus, mouse, paneles táctiles y otros dispositivos periféricos.
La compatibilidad con teclados externos implica cambios de configuración, que puedes administrar de dos maneras:
- Permite que el sistema vuelva a crear la actividad en ejecución y encárgate de administrar el estado de tu app.
- Administra el cambio de configuración por tu cuenta (la actividad no se volverá a crear):
- Declara todos los valores de configuración relacionados con el teclado.
- Crea un controlador de cambio de configuración.
Las apps de productividad, que a menudo requieren un control preciso de la IU para la entrada de texto y otras entradas, pueden beneficiarse del enfoque de "hazlo tú mismo" para controlar los cambios de configuración.
En casos especiales, es posible que quieras cambiar el diseño de tu app cuando se conecta o desconecta un teclado físico, por ejemplo, para crear más espacio para las herramientas o las ventanas de edición.
En Jetpack Compose, puedes reaccionar a los cambios de configuración del teclado de dos maneras:
- IU reactiva: Lee el estado de configuración actual directamente en tus elementos que admiten composición con
LocalConfiguration.current. La IU se vuelve a componer automáticamente para adaptarse al nuevo estado cuando se conecta o desconecta un teclado. - Devolución de llamada de efectos secundarios: Usa un
DisposableEffectcompatible con el ciclo de vida para registrar un objeto de escucha de cambios de configuración en la actividad host, lo que te permite activar eventos que no son de la IU (como el registro o la estadísticas) sin volver a crear la actividad ni crear instancias de elementos de vista ficticios.
Ingredientes
android:configChanges: Es el atributo del elemento<activity>del manifiesto de la app. Informa al sistema sobre los cambios de configuración que administra la app.LocalConfiguration: Es un proveedor local que admite composición y que expone el dispositivoConfiguration.DisposableEffect: Es una API de efectos secundarios de Compose que ejecuta un bloque de código cuando un elemento que admite composición ingresa a la composición y se limpia cuando sale.
Pasos
Declara el atributo configChanges y agrega valores relacionados con el teclado para evitar la recreación de la actividad. Luego, usa LocalConfiguration.current para adaptar de forma dinámica tu diseño que admite composición o registra un objeto de escucha de configuración con DisposableEffect.
1. Declara el atributo configChanges
Actualiza el elemento <activity> en el manifiesto de la app agregando los
keyboard|keyboardHidden valores a la lista de cambios de configuración ya administrados:
<activity
…
android:configChanges="...|keyboard|keyboardHidden">
2. Responde a los cambios de configuración del teclado
Para controlar los cambios de configuración en Jetpack Compose, usa una de las siguientes opciones según si actualizas la IU o ejecutas una devolución de llamada de efectos secundarios:
Opción A: IU reactiva (recomendada)
Lee el tipo de teclado directamente desde
LocalConfiguration.current. Cuando se conecta o desconecta un teclado físico, este valor cambia y Compose vuelve a componer automáticamente tu IU.val configuration = LocalConfiguration.current val isPhysicalKeyboardAttached = configuration.keyboard == Configuration.KEYBOARD_QWERTY if (isPhysicalKeyboardAttached) { // Render layout optimized for physical keyboard } else { // Render default layout }
Opción B: Objeto de escucha de efectos secundarios
Si necesitas ejecutar un efecto secundario (como registrar, actualizar una base de datos local o activar estadísticas) cuando cambia la configuración, usa un
DisposableEffectpara registrar un objeto de escucha de cambios de configuración en elComponentActivityhost.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
Ahora, tu app responderá a la conexión o desconexión de un teclado externo sin volver a crear la actividad en ejecución.
Recursos adicionales
Para obtener información sobre cómo guardar el estado de la IU de tu app durante los cambios de configuración, como la conexión o desconexión del teclado, consulta Cómo guardar estados de la IU.