Cambiar la orientación de la pantalla mediante programación con un botón

Respuestas:

216

¡Sí, es implementable!

ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

ActivityInfo

http://developer.android.com/reference/android/content/pm/ActivityInfo.html

Consulte el enlace:

Button buttonSetPortrait = (Button)findViewById(R.id.setPortrait);
Button buttonSetLandscape = (Button)findViewById(R.id.setLandscape);

buttonSetPortrait.setOnClickListener(new Button.OnClickListener(){

   @Override
   public void onClick(View arg0) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
   }

});

buttonSetLandscape.setOnClickListener(new Button.OnClickListener(){

   @Override
   public void onClick(View arg0) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
   }

});

http://android-er.blogspot.in/2011/08/set-screen-orientation-programmatic.html

Hariharan
fuente
Gracias. Pero, ¿esta función debe ejecutarse en un dispositivo rooteado? Parece que no funciona en mi teléfono celular, sino en mi tableta rooteada.
Sam
No, no es así ... De hecho, probé el código en ese enlace antes de publicarlo ... Estaba funcionando en mi dispositivo ...
Hariharan
está bien, sí, tienes razón. Acabo de probar otro dispositivo y funciona bien. bueno, mi Samsung Galaxy Nexus no funciona. No sé por qué.
Sam
4
Gracias por la respuesta. Pero esto bloquea la aplicación en ese modo. Cuando el usuario gira el dispositivo, la pantalla no gira.
Eco4ndly
2
Si configuro la orientación en horizontal mediante programación como esta respuesta, el usuario ya no puede cambiar la orientación girando el dispositivo. ¿Alguna forma de manejar este problema? Quiero hacer lo que se me enseñó en esta respuesta, pero luego, cuando el usuario gira el dispositivo, seguirá cambiando la orientación.
Soon Santos
36

Sí, puede configurar la orientación de la pantalla mediante programación en cualquier momento que desee usando:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

para el modo horizontal y vertical respectivamente. El método setRequestedOrientation () está disponible para la clase Activity , por lo que se puede usar dentro de tu Activity.

Y así es como puede obtener la orientación actual de la pantalla y configurarla adecuadamente según su estado actual:

Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
final int orientation = display.getOrientation(); 
 // OR: orientation = getRequestedOrientation(); // inside an Activity

// set the screen orientation on button click
Button btn = (Button) findViewById(R.id.yourbutton);
btn.setOnClickListener(new View.OnClickListener() {
          public void onClick(View v) {

              switch(orientation) {
                   case Configuration.ORIENTATION_PORTRAIT:
                       setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                       break;
                   case Configuration.ORIENTATION_LANDSCAPE:
                       setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                       break;                   
               }
          }
   });

Tomado de aquí: http://techblogon.com/android-screen-orientation-change-rotation-example/

EDITAR

Además, puede obtener la orientación de la pantalla mediante Configuration:

Activity.getResources().getConfiguration().orientation
Philipp Jahoda
fuente
3
Sugeriría usar getRequestedOrientation()para obtener la orientación de la pantalla actual: stackoverflow.com/a/21909327/1037294
a.ch.
getRequestedOrientation()le da UNSPECIFIEDcuando inicia la aplicación. Así que con el oyente por encima de ella no va a cambiar la pantalla y si se agrega UNSPECIFIEDa la switchque debe poner la pantalla en una de Vertical / Horizontal primera posición.
mortalis
22

Siempre que sea posible, no utilice SCREEN_ORIENTATION_LANDSCAPE o SCREEN_ORIENTATION_PORTRAIT. En su lugar use:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);

Estos permiten al usuario orientar el dispositivo en orientación horizontal o vertical, respectivamente. Si alguna vez ha tenido que jugar un juego con un cable de carga en su estómago, entonces sabe exactamente por qué es importante para el usuario tener ambas orientaciones disponibles.

Nota: Para los teléfonos, al menos varios de los que he verificado, solo permite el modo vertical "con el lado derecho hacia arriba"; sin embargo, SENSOR_PORTRAIT funciona correctamente en tabletas.

Nota: esta función se introdujo en el nivel de API 9, por lo que si debe admitir 8 o menos (no es probable en este momento), utilice en su lugar:

setRequestedOrientation(Build.VERSION.SDK_INT < 9 ?
                        ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE :
                        ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
setRequestedOrientation(Build.VERSION.SDK_INT < 9 ?
                        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT :
                        ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
Pablo
fuente
19

Use esto para establecer la orientación de la pantalla:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

o

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

y no olvides agregar esto a tu manifiesto:

android:configChanges = "orientation"
Sathya
fuente
2
Necesitas ambos "orientation|screenSize", mira aquí: developer.android.com/guide/topics/resources/…
Benny
7

Un código de trabajo:

private void changeScreenOrientation() {
    int orientation = yourActivityName.this.getResources().getConfiguration().orientation;
    if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        showMediaDescription();
    } else {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        hideMediaDescription();
    }
    if (Settings.System.getInt(getContentResolver(),
            Settings.System.ACCELEROMETER_ROTATION, 0) == 1) {
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
            }
        }, 4000);
    }
}

llame a este método en su botón haga clic

Liya
fuente