2010-03-02 19 views

Respuesta

119
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

Invocado en una actividad, se bloqueará en horizontal. Busque los otros indicadores en la clase ActivityInfo. Puede bloquearlo de nuevo en vertical o convertirlo en sensor/control deslizante.

Más información aquí: http://www.devx.com/wireless/Article/40792

+12

Ok gracias. Esto funciona genial Eso obtendrá la orientación actual. getResources(). GetConfiguration().orientación – Jared

+6

¡Cuidado! Debe diferenciar entre lo que getConfiguration() devuelve y lo que quiere setRequestedOrientation - vea mi respuesta a continuación para obtener detalles –

+0

. Existe un problema con este enfoque. Asegúrese de leer el comentario de [esta respuesta] (http://stackoverflow.com/a/3614089/1708390) –

27

me parecía tenido tiene un caso similar. Quería apoyar cualquier orientación, pero necesitaba permanecer en la orientación actual después de cierto punto en el flujo de trabajo. Mi solución fue:

En la entrada del flujo de trabajo protegido:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); 

En la salida del flujo de trabajo protegido:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
+1

Esto no soluciona el OQ, al menos en Android> = 16. setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_NOSENSOR) puede configurar el dispositivo en horizontal incluso si estaba en vertical, mientras que la pregunta se refiere a la orientación de bloqueo que se le dio. – greg7gkb

+1

para mí, configurándolo en nosensor me lleva de vuelta al modo vertical si estaba en el paisaje Utilicé SCREEN_ORIENTATION_LOCKED en su lugar y me funcionó – Jimmar

+0

@JiMMaR SCREEN_ORIENTATION_LOCKED es la mejor forma para Android> = 18. Pero en caso de que apunte a algo más bajo , eso no funciona. Sugiero usar la respuesta de jp36 a continuación. –

95

Sé cuidadoso de la diferencia entre lo que getConfiguration devoluciones y lo setRequestedOrientation quiere - ambos son int, pero provienen de diferentes definiciones constantes.

Así es como para bloquear la orientación actual, al tiempo que permite 180 grados voltea

int currentOrientation = getResources().getConfiguration().orientation; 
if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) { 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 
} 
else { 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); 
} 
+11

Es posible que prefiera usar SCREEN_ORIENTATION_USER_LANDSCAPE, ya que esto no permite los volteos de 180 grados si el usuario ha desactivado la rotación de la pantalla en la configuración. Del mismo modo, al volver a la rotación libre, SCREEN_ORIENTATION_USER es mejor que SCREEN_ORIENTATION_SENSOR, ya que este último permite la rotación libre, incluso si los ajustes dicen que no. –

+0

¡Brillante! Es necesario agregar que cuando se cambia a orientación inversa la reconfiguración no ocurre. Al menos en dispositivos en los que lo he probado. Es realmente importante saber si desea detener la reconfiguración durante algunos programas de diálogo, etc. – sberezin

45

Esto funciona en dispositivos con el retrato y el paisaje inversa inversa.

bloqueo de la orientación:

int orientation = getActivity().getRequestedOrientation(); 
    int rotation = ((WindowManager) getActivity().getSystemService(
      Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation(); 
    switch (rotation) { 
    case Surface.ROTATION_0: 
     orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 
     break; 
    case Surface.ROTATION_90: 
     orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; 
     break; 
    case Surface.ROTATION_180: 
     orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 
     break; 
    default: 
     orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; 
     break; 
    } 

    getActivity().setRequestedOrientation(orientation); 

orientación Desbloquear:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
+4

Obtener rotación '" Devuelve la rotación de la pantalla desde su orientación "natural". '' [Fuente] (http://developer.android.com/ reference/android/view/Display.html # getRotation()). Por lo tanto, en un teléfono que dice ROTATION_0 es probable que el retrato sea correcto, pero en una tableta su orientación "natural" probablemente sea un paisaje y ROTATION_0 debería devolver el paisaje en lugar del retrato. – jp36

+0

@ jp36, probé en un Nexus 7 que tiene una orientación natural que es la misma que la de un teléfono. Gracias por probar en una tableta más grande (que no tengo). – pstoppani

+1

Como dijo jp36, ¡no funciona en tabletas con una orientación de paisaje natural! – DominicM

19

Alternativa a @pstoppani respuesta con soporte para tabletas (Como con respuesta @pstoppani, esta voluntad solo funciona en dispositivos> 2.2)
- Pendiente en Samsung Galaxy SIII y Samsung Galaxy Tab 10.1

public static void lockOrientation(Activity activity) { 
    Display display = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
    int rotation = display.getRotation(); 
    int tempOrientation = activity.getResources().getConfiguration().orientation; 
    int orientation = 0; 
    switch(tempOrientation) 
    { 
    case Configuration.ORIENTATION_LANDSCAPE: 
     if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90) 
      orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; 
     else 
      orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; 
     break; 
    case Configuration.ORIENTATION_PORTRAIT: 
     if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270) 
      orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 
     else 
      orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 
    } 
    activity.setRequestedOrientation(orientation); 
} 
3

Aquí está mi código, se puede bloquear con uno de estos métodos de la pantalla y una vez que termine la tarea desbloquearlo con unlockOrientation:

/** Static methods related to device orientation. */ 
public class OrientationUtils { 
    private OrientationUtils() {} 

    /** Locks the device window in landscape mode. */ 
    public static void lockOrientationLandscape(Activity activity) { 
     activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    } 

    /** Locks the device window in portrait mode. */ 
    public static void lockOrientationPortrait(Activity activity) { 
    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    } 

    /** Locks the device window in actual screen mode. */ 
    public static void lockOrientation(Activity activity) { 
     final int orientation = activity.getResources().getConfiguration().orientation; 
     final int rotation = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation(); 

     // Copied from Android docs, since we don't have these values in Froyo 2.2 
     int SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8; 
     int SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9; 

     // Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO 
     if (!BuildVersionUtils.hasGingerbread()) { 
      SCREEN_ORIENTATION_REVERSE_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; 
      SCREEN_ORIENTATION_REVERSE_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 
     } 

     if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90){ 
      if (orientation == Configuration.ORIENTATION_PORTRAIT){ 
       activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
      } 
      else if (orientation == Configuration.ORIENTATION_LANDSCAPE){ 
       activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
      } 
     } 
     else if (rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270) 
     { 
      if (orientation == Configuration.ORIENTATION_PORTRAIT){ 
       activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_PORTRAIT); 
      } 
      else if (orientation == Configuration.ORIENTATION_LANDSCAPE){ 
       activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
      } 
     } 
    } 

    /** Unlocks the device window in user defined screen mode. */ 
    public static void unlockOrientation(Activity activity) { 
     activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER); 
    } 

} 
0

Aquí es la conversión de Xamarin @pstoppani La respuesta de arriba.

NOTA: esto es para un Fragmento, reemplace Actividad. con esto. si se usa dentro de una actividad.

public void LockRotation() 
{ 
    ScreenOrientation orientation; 

    var surfaceOrientation = Activity.WindowManager.DefaultDisplay.Rotation; 

    switch (surfaceOrientation) { 
     case SurfaceOrientation.Rotation0: 
      orientation = ScreenOrientation.Portrait; 
      break; 
     case SurfaceOrientation.Rotation90: 
      orientation = ScreenOrientation.Landscape; 
      break; 
     case SurfaceOrientation.Rotation180: 
      orientation = ScreenOrientation.ReversePortrait; 
      break; 
     default: 
      orientation = ScreenOrientation.ReverseLandscape; 
      break; 
    } 

    Activity.RequestedOrientation = orientation; 
} 

public void UnlockRotation() 
{ 
    Activity.RequestedOrientation = ScreenOrientation.Unspecified; 
} 

Esto no se ha probado como fue con un enfoque diferente antes de usarlo, pero puede ser útil.

+0

Esta es la misma respuesta que la de pstoppani, y fallará en una tableta. –

Cuestiones relacionadas