La compatibilidad con teclados desmontables ayuda a maximizar la productividad del usuario en dispositivos con pantallas grandes. Android activa un cambio de configuración cada vez que se conecta o desconecta un teclado de un dispositivo, lo que puede provocar una 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 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 objeto Configuration. 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 lápices ópticos, mouses, paneles táctiles y otros dispositivos periféricos.
La compatibilidad con teclados externos implica cambios de configuración que puedes administrar de dos maneras:
- Deja que el sistema recree la actividad en ejecución y tú te encargarás 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 cambios 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 "hágalo usted mismo" para controlar los cambios de configuración.
En casos especiales, es posible que desees cambiar el diseño de tu app cuando se conecta o desconecta un teclado de hardware, por ejemplo, para dejar 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 componibles con
LocalConfiguration.current. La IU se recompone automáticamente para adaptarse al nuevo estado cuando se conecta o desconecta un teclado. - Devolución de llamada de efecto secundario: Usa un
DisposableEffectcompatible con el ciclo de vida para registrar un objeto de escucha de cambios de configuración en la actividad del host, lo que te permite activar eventos que no son de la IU (como el registro o las estadísticas) sin recrear 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 componible que expone elConfigurationdel dispositivo actual.DisposableEffect: API de efectos secundarios de Compose que ejecuta un bloque de código cuando un elemento componible ingresa en la composición y realiza una limpieza 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 de Composable 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 valores de keyboard|keyboardHidden a la lista de cambios de configuración ya administrados:
<activity
…
android:configChanges="...|keyboard|keyboardHidden">
2. Cómo responder 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 efecto secundario:
Opción A: IU reactiva (recomendada)
Lee el tipo de teclado directamente desde
LocalConfiguration.current. Cuando se conecta o desconecta un teclado de hardware, este valor cambia y Compose recompone 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: Side-Effect Listener
Si necesitas ejecutar un efecto secundario (como registrar, actualizar una base de datos local o activar Analytics) cuando cambia la configuración, usa un
DisposableEffectpara registrar un objeto de escucha de cambios de configuración en elComponentActivitydel 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
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
Si quieres obtener más información para 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.