Deshabilitar y habilitar cambios de orientación en una actividad en Android mediante programación
Tengo una aplicación que hace un poco de personal de fondo. Cuando el trabajo de fondo se está ejecutando un círculo de progreso se muestra, si el dispositivo se gira durante este tiempo, a continuación, la actividad es "restablecer" y quiero evitar eso.
Por esta razón decidí desactivar la orientación durante este proceso. He visto diferentes hilos para esta pregunta, pero ninguno con una solución válida, al menos en mi caso.
- Comprensión adicional setRetainInstance (true)
- Cómo girar un icono de Android en su punto central?
- Cómo rotar el mapa de bits correctamente?
- Android: screenOrientation = "sensorPortrait" no funciona en API +17
- Cómo rotar un dibujable por ObjectAnimator?
Las soluciones publicadas son sobre la fijación de la orientación de la actividad, pero usted tiene que lidiar con el hecho de que las orientaciones REVERSE no se devuelven si se utiliza:
getResources().getConfiguration().orientation
La función anterior devuelve SCREEN_ORIENTATION_PORTRAIT tanto para los casos PORTRAIT como REVERSE_PORTRAIT (al menos en mis pruebas).
Así que al final he utilizado el valor de rotación para hacer frente a eso, por lo que mi código "desactivar la rotación" es:
int rotation = getWindowManager().getDefaultDisplay().getRotation(); switch(rotation) { case Surface.ROTATION_180: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); break; case Surface.ROTATION_270: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); break; case Surface.ROTATION_0: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); break; case Surface.ROTATION_90: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); break; }
Y para permitir de nuevo la orientación:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
Eso funciona perfectamente en un dispositivo con Android 4.1.2, pero en un dispositivo con Android 4.2.1 no está funcionando como se esperaba.
Supongo que la gestión de la rotación en el ciclo de actividad en vivo debe ser un problema común, pero no he sido capaz de encontrar una solución adecuada. Puede ser que estoy buscando a la dirección equivocada por lo que cualquier ayuda es realmente bienvenida.
Gracias de antemano, Iván.
- Android, ayuda a girar la imagen en el tacto
- Cómo girar cuatro sprites al foco de estos sprites
- La forma más simple de rotar correctamente MapView en Android?
- Android ProgressBar personalizado no está girando
- Aplicar una animación a varias vistas al mismo tiempo
- LibGDX 1.5 girando sprite alrededor de su centro
- DialogFragment en Fragmento con rotación de pantalla
- Cómo utilizar el evento del sensor Android para determinar si el dispositivo está orientado hacia arriba o hacia abajo
Si desea desactivar los cambios de orientación del teléfono, puede utilizar este código en el manifiesto
<activity android:name=".class_name"
// si desea que su pantalla en
android:screenOrientation="portrait" >
// si desea que la pantalla en modo horizontal
android:screenOrientation="landscape" >
Y si desea que su teléfono cambie de orientación pero evite que se reinicie el proceso, puede utilizar el método onConfigurationChanged en su clase:
@Override public void onConfigurationChanged(Configuration newConfig) { // ignore orientation change if (newConfig.orientation != Configuration.ORIENTATION_LANDSCAPE) { super.onConfigurationChanged(newConfig); } }
Prueba esto..
No hay ningún error en su código. Es correcto lo revisé. Utilice ese código en onConfigurationChanged
que puede dar la diferencia y otra cosa es usar debajo del código para deshabilitar el restablecimiento de la actividad.
<activity android:name="YourActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:windowSoftInputMode="adjustPan"/>
Podría anular el método on onConfiguratoinChanged para inhabilitar los cambios de orientación:
@Override public void onConfigurationChanged(Configuration newConfig) { // ignore orientation change if (newConfig.orientation != Configuration.ORIENTATION_LANDSCAPE) { super.onConfigurationChanged(newConfig); } }
No olvide activar la orientación cambiada de escucha en su archivo AndroidManifest.xml:
<activity android:configChanges="orientation" >
Simple: una línea para agregar después de Nombre de actividad en android manifiesto
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale
Esto funcionó para mí.