Enfoque Moderno: Estados en Jetpack Compose
En el desarrollo moderno con Jetpack Compose, ya no solemos "bloquear" la rotación en el Manifiesto. En su lugar, el enfoque correcto es hacer que nuestra interfaz sea capaz de sobrevivir a la recreación de la actividad preservando su estado.
Preservación de estado con rememberSaveable
A diferencia del remember estándar (que se pierde al rotar), en Compose utilizamos rememberSaveable para que los datos sobrevivan a los cambios de configuración:
// En Compose, esto sobrevive a la rotación de pantalla automáticamente
var name by rememberSaveable { mutableStateOf("") }
TextField(
value = name,
onValueChange = { name = it },
label = { Text("Nombre") }
)Uso de ViewModel
La mejor práctica actual es delegar el estado a un ViewModel. Los ViewModels están diseñados para permanecer en memoria mientras la Actividad se recrea por una rotación.
class MyViewModel : ViewModel() {
// Este estado persiste aunque la pantalla gire
var uiState by mutableStateOf(MyState())
}Con este enfoque moderno, permitimos que Android gestione los recursos de pantalla de forma nativa (cargando diferentes diseños si es necesario) sin perder la información que el usuario ya ha introducido.
Muchas veces al momento de probar nuestra aplicación Android, ya sea en un emulador o en un dispositivo físico, podemos ver que cuando rotamos la pantalla las actividades se reinician por defecto. Esto trae como consecuencia que se borren los textos en los campos o se pierdan estados críticos de la interfaz.
Esto ocurre porque al girar el dispositivo, el método onCreate es invocado nuevamente siguiendo el ciclo de vida básico de Android.
Enfoque Legacy: Configuración en el AndroidManifest
En el desarrollo tradicional basado en XML y Actividades, una solución rápida para evitar el reinicio es agregar el atributo android:configChanges en el tag de la actividad dentro del AndroidManifest.xml:
android:configChanges="screenSize|orientation|screenLayout"Un ejemplo más completo:
<activity
android:name=".MainActivity"
android:configChanges="screenSize|orientation|screenLayout">
</activity>¿Qué significa cada atributo?
- orientation: Detecta cuando el usuario ha rotado la pantalla física.
- screenSize: Se dispara cuando la resolución disponible cambia (al rotar entre landscape y portrait).
- screenLayout: Se asegura de que otros cambios en el layout no reinicien la actividad.
Nota importante: Si deshabilitas el reinicio en una actividad que tiene diferentes archivos de diseño (layouts) para horizontal y vertical, el sistema no cargará el nuevo layout automáticamente al rotar. Deberás manejar el cambio manualmente en el método onConfigurationChanged.
¿Por qué no configurar todas las actividades para que no se reinicien por defecto?
Depende de cómo estén configuremos nuestras actividades; como podrás saber, al momento de diseñar una actividad para múltiples resoluciones y posiciones de pantalla (landscape/portrait) puede que necesitemos definir múltiples layouts por actividad:

Lo que significa que si deshabilitados el reinicio de una actividad que presenta múltiples layouts y rotamos (giramos) el dispositivo móvil, el layout no se actualizará.