Altere a orientação da tela programaticamente usando um botão

Respostas:

216

Sim, é implementável!

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 o link:

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-programmatically.html

Hariharan
fonte
Obrigado. Mas é esta função que precisa ser executada em um dispositivo com acesso root? Parece que não está funcionando no meu celular, mas no meu tablet enraizado.
Sam
Não, não é assim .. Na verdade eu testei o código nesse link antes de postar .. Ele estava funcionando no meu dispositivo ..
Hariharan
ok, sim, você está certo. Acabei de testar outro dispositivo e funciona bem. bem, meu Samsung Galaxy Nexus não funciona. Não sei por quê.
Sam
4
Obrigado pela resposta. Mas esta bloqueando o aplicativo nesse modo. Quando o usuário está girando o dispositivo, a tela não está girando.
Eco4ndly
2
Se eu definir a orientação para paisagem de maneira programática como esta resposta, o usuário não poderá mais alterar a orientação girando o dispositivo. Alguma maneira de lidar com esse problema? Quero fazer o que foi ensinado nesta resposta, mas quando o usuário girar o dispositivo, ele continuará mudando a orientação.
Em breve Santos
36

Sim, você pode definir a orientação da tela programaticamente sempre que quiser usando:

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

para o modo paisagem e retrato, respectivamente. O método setRequestedOrientation () está disponível para a classe Activity , portanto, pode ser usado dentro de sua Activity.

E é assim que você pode obter a orientação da tela atual e configurá-la adequadamente, dependendo de seu estado atual:

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

Retirado daqui: http://techblogon.com/android-screen-orientation-change-rotation-example/

EDITAR

Além disso, você pode obter a orientação da tela usando Configuration:

Activity.getResources().getConfiguration().orientation
Philipp Jahoda
fonte
3
Sugiro usar getRequestedOrientation()para obter a orientação da tela atual: stackoverflow.com/a/21909327/1037294
a.ch.
getRequestedOrientation()UNSPECIFIEDquando você inicia o aplicativo. Portanto, com o ouvinte acima, ele não mudará a tela e, se você adicionar UNSPECIFIEDao, switchele deve colocar a tela em uma das posições Retrato / Paisagem primeiro.
mortalis
22

Sempre que possível, não use SCREEN_ORIENTATION_LANDSCAPE ou SCREEN_ORIENTATION_PORTRAIT. Em vez disso, use:

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

Eles permitem que o usuário oriente o dispositivo na orientação paisagem ou na orientação retrato, respectivamente. Se você já teve que jogar um jogo com um cabo de carga sendo colocado em seu estômago, você sabe exatamente por que ter as duas orientações disponíveis é importante para o usuário.

Nota: Para telefones, pelo menos vários que eu verifiquei, ele só permite o modo retrato "lado direito para cima", no entanto, SENSOR_PORTRAIT funciona corretamente em tablets.

Observação: esse recurso foi introduzido na API de nível 9, portanto, se você deve oferecer suporte a 8 ou inferior (provavelmente não é neste momento), use:

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);
Paulo
fonte
19

Use para definir a orientação da tela:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

ou

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

e não se esqueça de adicionar ao seu manifesto:

android:configChanges = "orientation"
Sathya
fonte
2
Você precisa de ambos "orientation|screenSize", veja aqui: developer.android.com/guide/topics/resources/…
Benny
7

Um código funcional:

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

chame este método em seu clique de botão

Liya
fonte