Hay una manera de bloquear la orientación durante el tiempo de ejecución? Por ejemplo me gustaría para permitir al usuario bloquear la pantalla a horizontal si el usuario que se encuentra en el paisaje y cambiar la opción de menú.

InformationsquelleAutor Jared | 2010-03-02

7 Comentarios

  1. 127
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    Llamado en una actividad, se bloqueará en el paisaje. La mirada de los otros indicadores en el ActivityInfo clase. Se puede bloquear de nuevo el retrato o hacer sensor/control deslizante accionado.

    Más info aquí: http://www.devx.com/wireless/Article/40792

    • Ok gracias. Esto funciona muy bien. Que va a obtener la orientación actual. getResources().getConfiguration().orientación
    • Cuidado! Usted necesita differentate entre lo que getConfiguration() devuelve y lo setRequestedOrientation que quiere ver mi respuesta a continuación para obtener más detalles
    • hay un problema con este enfoque. Asegúrese de que usted vaya a través de la observación de esta respuesta
    • pero establece la misma orientación para toda la actividad, es allí cualquier otro modo, donde podemos cambiar la orientación
  2. 101

    Tener cuidado de la diferencia entre lo que getConfiguration devuelve y lo setRequestedOrientation quiere – ambos son de tipo int, pero son procedentes de los diferentes definiciones constantes.

    He aquí cómo bloquear la orientación actual, mientras que permite a 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);
    }
    • Puede que prefieras usar SCREEN_ORIENTATION_USER_LANDSCAPE como esto no permite que los 180 grados volteretas si el usuario ha desactivado la rotación de la pantalla en la configuración. De manera similar al regresar a la rotación libre, SCREEN_ORIENTATION_USER es mejor que SCREEN_ORIENTATION_SENSOR como el último permite la rotación libre, incluso si la configuración decir que no.
    • Genial! Necesidad de añadir que cuando usted conmutador para invertir la orientación de la reconfiguración de no producirse. Al menos en los dispositivos que he probado en. Es muy importante saber si usted desea dejar de reconfiguración durante algunos de diálogo muestra etc
  3. 46

    Esto funciona en dispositivos con inversa vertical inversa y paisaje.

    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);

    Desbloquear orientación:

       getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    • Obtener la rotación "Returns the rotation of the screen from its "natural" orientation." fuente. Así, en un teléfono diciendo que ROTATION_0 es el retrato es probablemente correcta, pero en un tablet «natural» de la orientación es probable paisaje y ROTATION_0 debe devolver el paisaje en lugar de vertical.
    • He probado en un Nexus 7 que tiene una orientación natural, que es el mismo que el de un teléfono. Gracias por la prueba en una más grande de la tableta (que no tengo).
    • Como jp36 dijo, no funciona en tablets con un paisaje natural de la orientación!
  4. 27

    Parecía yo tuve un caso similar. Yo quería apoyar a cualquier orientación, pero yo necesitaba estar en la orientación actual después de un cierto punto en el flujo de trabajo. Mi solución fue:

    A la entrada de la protegida de flujo de trabajo:

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

    En la salida de la protegida de flujo de trabajo:

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    • Esto no abordar el OQ, al menos en Android >= 16. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR) puede configurar el dispositivo para que el paisaje, incluso si era en vertical, mientras que la pregunta se refiere a la orientación de bloqueo que se le dio.
    • a mí, que a nosensor me lleva de nuevo a modo de retrato de si yo estaba en paisaje yo solía SCREEN_ORIENTATION_LOCKED lugar y a mí me funcionó
    • SCREEN_ORIENTATION_LOCKED es la mejor manera para Android >= 18. Pero en caso de que meta algo inferior, que no funciona. Yo sugiero utilizar jp36 la respuesta a continuación.
  5. 21

    Alternativa a @pstoppani respuesta con soporte para tablets (Como con @pstoppani respuesta, esto sólo funcionará en dispositivos >2.2)
    Probado 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);
    }
  6. 5

    Aquí está mi código, no se pudo bloquear con uno de estos métodos de la pantalla y una vez terminada la tarea de desbloquear 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);
    }
    }
  7. 0

    Aquí es el Xamarin conversión de @pstoppani ‘s respuesta anterior.

    NOTA: este es un Fragmento de reemplazar Actividad. con este. 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 ser utilizada, pero puede ser de utilidad.

    • Esta es la misma respuesta que pstoppani, y se producirá un error en un tablet.

Dejar respuesta

Please enter your comment!
Please enter your name here