En caso de que esto sea útil para algunos desarrolladores más nuevos porque no está especificado anteriormente. Solo para ser muy explícito:
Necesita dos cosas si usa onConfigurationChanged :
Un onConfigurationChangedmétodo en tu clase de actividad
Especifique en su manifiesto qué cambios de configuración serán manejados por su onConfigurationChangedmétodo
El fragmento de manifiesto en las respuestas anteriores, aunque sin duda es correcto para la aplicación en particular a la que pertenece el manifiesto, NO es exactamente lo que necesita agregar en su manifiesto para activar el método onConfigurationChanged en su Clase de actividad. es decir, la entrada de manifiesto a continuación puede no ser correcta para su aplicación.
<activity name= ".MainActivity" android:configChanges="orientation|screenSize"/>
En la entrada de manifiesto anterior, hay varias acciones de Android para las android:configChanges=""que pueden activar onCreate en el ciclo de vida de su actividad.
Esto es muy importante: los que NO están especificados en el manifiesto son los que activan su onCreate y los especificados en el manifiesto son los que activan su onConfigurationChangedmétodo en su Clase de actividad.
Por lo tanto, debe identificar qué cambios de configuración debe manejar usted mismo. Para los con desafíos enciclopédicos de Android como yo, utilicé la ventana emergente de sugerencias rápidas en Android Studio y agregué casi todas las opciones de configuración posibles. Enumerar todos estos básicamente decía que yo manejaría todo y nunca se llamará a onCreate debido a las configuraciones.
<activity name= ".MainActivity" android:configChanges="screenLayout|touchscreen|mnc|mcc|density|uiMode|fontScale|orientation|keyboard|layoutDirection|locale|navigation|smallestScreenSize|keyboardHidden|colorMode|screenSize"/>
Ahora, obviamente, no quiero manejar todo, así que comencé a eliminar las opciones anteriores una a la vez. Reconstruir y probar mi aplicación después de cada eliminación.
Otro punto importante : si solo hay una opción de configuración que se maneja automáticamente y que activa su onCreate (no la tiene enumerada en su manifiesto anterior), entonces parecerá que onConfigurationChangedno está funcionando. Debes poner todos los relevantes en tu manifiesto.
Terminé con 3 que estaban activando onCreate originalmente, luego probé en un S10 + y todavía estaba recibiendo el onCreate, así que tuve que hacer mi ejercicio de eliminación nuevamente y también necesitaba el |screenSize. Así que prueba en una selección de plataformas.
<activity name= ".MainActivity" android:configChanges="screenLayout|uiMode|orientation|screenSize"/>
Entonces mi sugerencia, aunque estoy seguro de que alguien puede hacer agujeros en esto:
Agregue su onConfigurationChangedmétodo en su clase de actividad con un TOAST o LOG para que pueda ver cuándo está funcionando.
Agregue todas las opciones de configuración posibles a su manifiesto.
Confirma que tu onConfigurationChangedmétodo funciona probando tu aplicación.
Elimina cada opción de configuración de tu archivo de manifiesto una a la vez, probando tu aplicación después de cada una.
Pruebe en la mayor variedad de dispositivos posible.
No copie / pegue mi fragmento anterior en su archivo de manifiesto. Las actualizaciones de Android cambian la lista, así que use las sugerencias emergentes de Android Studio para asegurarse de obtenerlas todas.
Espero que esto le ahorre a alguien algo de tiempo.
Mi onConfigurationChangedmétodo solo para obtener información a continuación. onConfigurationChangedse llama en el ciclo de vida después de que la nueva orientación esté disponible, pero antes de que se haya vuelto a crear la interfaz de usuario. Por lo tanto, el primero ifen verificar que la orientación funciona correctamente, y luego el segundo anidado ifpara ver la visibilidad de mi UI ImageView también funciona correctamente.
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
pokerCardLarge = findViewById(R.id.pokerCardLgImageView);
if(pokerCardLarge.getVisibility() == pokerCardLarge.VISIBLE){
Bitmap image = ((BitmapDrawable)pokerCardLarge.getDrawable()).getBitmap();
pokerCardLarge.setVisibility(pokerCardLarge.VISIBLE);
pokerCardLarge.setImageBitmap(image);
}
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
pokerCardLarge = findViewById(R.id.pokerCardLgImageView);
if(pokerCardLarge.getVisibility() == pokerCardLarge.VISIBLE){
Bitmap image = ((BitmapDrawable)pokerCardLarge.getDrawable()).getBitmap();
pokerCardLarge.setVisibility(pokerCardLarge.VISIBLE);
pokerCardLarge.setImageBitmap(image);
}
}
}