Mi actividad principal tiene un código que realiza algunos cambios en la base de datos que no deben interrumpirse. Estoy haciendo el trabajo pesado en otro hilo y usando un diálogo de progreso que establecí como no cancelable. Sin embargo, noté que si giro mi teléfono, se reinicia la actividad, lo cual es REALMENTE malo para el proceso que se estaba ejecutando, y obtengo un cierre forzado.
Lo que quiero hacer es deshabilitar programáticamente los cambios de orientación de la pantalla hasta que se complete mi proceso, momento en el que se habilitan los cambios de orientación.
android
screen-orientation
android-orientation
Christopher Perry
fuente
fuente
Respuestas:
Como explica Chris en su auto-respuesta , llamando
y entonces
realmente funciona como un encanto ... ¡en dispositivos reales!
No crea que está roto al probar en el emulador, el atajo ctrl + F11 SIEMPRE cambia la orientación de la pantalla, sin emular movimientos de sensores.
EDITAR: esta no fue la mejor respuesta posible. Como se explica en los comentarios, existen problemas con este método. La verdadera respuesta está aquí .
fuente
ActivityInfo.SCREEN_ORIENTATION_SENSOR
no respeta el bloqueo de orientación nativo de Android. Restableciendo la orientación aActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
hace.Ninguna de las otras respuestas funcionó perfectamente para mí, pero esto es lo que encontré que hace.
Bloquear la orientación a la actual ...
Cuando se deba volver a permitir el cambio de orientación, vuelva a establecer el valor predeterminado ...
fuente
Configuration.ORIENTATION_PORTRAIT
se devolverá en ambos modos de paisaje (es decir, "normal" y al revés). Entonces, si el teléfono está en orientación horizontal invertida y lo configura,ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
se volteará boca abajo. En API 9, ActivityInfo introduceSCREEN_ORIENTATION_REVERSE_LANDSCAPE
constante, pero no veo una forma de detectar dicha orientación a través de laConfiguration
clase.Aquí hay una solución más completa y actualizada que funciona para API 8+, funciona para retrato y paisaje inverso, y funciona en una pestaña Galaxy donde la orientación "natural" es horizontal (llame
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
para desbloquear la orientación):fuente
static
y agregarloActivity activity
como parámetro.Para administrar también los modos de orientación inversa, he usado ese código para corregir la orientación de la actividad:
Y para permitir nuevamente la orientación:
fuente
Úselo
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
para bloquear la orientación actual, ya sea horizontal o vertical.Úselo
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
para desbloquear la orientación.fuente
Encontré la respuesta. Para hacer esto, en una Actividad puedes llamar
setRequestedOrientation(int)
con uno de los valores especificados aquí: http://developer.android.com/reference/android/R.attr.html#screenOrientationAntes de iniciar mi hilo, llamé
setRequestedOrientation(OFF)
(OFF = sensor de nariz) y cuando terminó el hilo llamésetRequestedOrientation(ON)
(ON = sensor). Funciona de maravilla.fuente
Gracias a todos. Modifiqué la solución de Pilot_51 para asegurarme de restaurar al estado anterior. También agregué un cambio para admitir pantallas que no son horizontales ni verticales (pero no lo he probado en una pantalla de este tipo).
Luego para restaurarlo
fuente
switch
aunque.fuente
Aquí hay una solución que funciona todo el tiempo y conserva la orientación actual (usando
Activity.Info.SCREEN_ORIENTATION_PORTRAIT
conjuntos a 0 ° por ejemplo, pero el usuario puede tener una orientación de 180 ° como la actual).fuente
Úselo
ActivityInfo.SCREEN_ORIENTATION_USER
si desea rotar la pantalla solo si está habilitado en el dispositivo.fuente
Esto funciona perfecto para mí. Resuelve el problema con la diferente "orientación natural" de la tableta / teléfono;)
fuente
Se me ocurrió una solución que depende de la rotación de la pantalla y luego decide la orientación del dispositivo. Al conocer la orientación, podemos bloquear la orientación y liberarla más tarde cuando sea necesario. Esta solución también puede determinar si el dispositivo está en modo horizontal inverso .
Luego, más tarde, si necesitamos liberar la orientación, podemos llamar a este método:
fuente
Creo que este código es más fácil de leer.
fuente
He descubierto que se necesita una combinación de valores de rotación / orientación existentes para cubrir las cuatro posibilidades; están los valores de retrato / paisaje y la orientación natural del dispositivo. Digamos que la orientación natural de los dispositivos tendrá un valor de rotación de 0 grados cuando la pantalla esté en su orientación vertical u horizontal "natural". De manera similar, habrá un valor de rotación de 90 grados cuando esté en horizontal o vertical (observe que es opuesto a la orientación a 0 grados). Por lo tanto, los valores de rotación que no sean 0 o 90 grados implicarán una orientación "inversa". Ok, aquí hay un código:
fuente
No me gustó la mayoría de las respuestas aquí, ya que en el desbloqueo lo configuraron como SIN ESPECIFICAR en comparación con el estado anterior. ProjectJourneyman lo tuvo en cuenta, lo cual fue genial, pero preferí el código de bloqueo de Roy. Entonces, mi recomendación sería una combinación de las dos:
fuente
Puedes usar
fuente
usa esa línea de código
en nuestro método de actividad oncreate
fuente