Modificare l'orientamento dello schermo a livello di codice utilizzando un pulsante


Risposte:


216

Sì, è implementabile!

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

Fare riferimento al collegamento:

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


Grazie. Ma questa funzione deve essere eseguita su un dispositivo rooted? Sembra che non funzioni sul mio cellulare ma sul mio tablet con root.
Sam il

No, non è così .. In realtà ho testato il codice in quel link prima di postare .. Funzionava sul mio dispositivo ..
Hariharan

ok, sì, hai ragione. ho appena provato un altro dispositivo e funziona bene. bene, il mio Samsung Galaxy Nexus non funziona. Non so perché.
Sam il

4
Grazie per la risposta. Ma questo blocca l'applicazione in quella modalità. Quando l'utente ruota il dispositivo, lo schermo non ruota.
Eco4ndly

2
Se imposto programmaticamente l'orientamento orizzontale come questa risposta, l'utente non è più in grado di modificare l'orientamento ruotando il dispositivo. Qualche modo per gestire questo problema? Voglio fare ciò che è stato insegnato in questa risposta, ma poi quando l'utente ruota il dispositivo continuerà a cambiare l'orientamento.
Presto Santos

36

Sì, puoi impostare l'orientamento dello schermo in modo programmatico ogni volta che vuoi utilizzando:

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

rispettivamente per la modalità orizzontale e verticale. Il metodo setRequestedOrientation () è disponibile per la classe Activity , quindi può essere utilizzato all'interno della tua Activity.

Ed è così che puoi ottenere l'orientamento corrente dello schermo e impostarlo adeguatamente a seconda del suo stato corrente:

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

Tratto da qui: http://techblogon.com/android-screen-orientation-change-rotation-example/

MODIFICARE

Inoltre, puoi ottenere l'orientamento dello schermo utilizzando Configuration:

Activity.getResources().getConfiguration().orientation

3
Io suggerirei di utilizzare getRequestedOrientation()per ottenere l'orientamento dello schermo corrente: stackoverflow.com/a/21909327/1037294
a.ch.

getRequestedOrientation()ti dà UNSPECIFIEDquando avvii l'app. Quindi con l'ascoltatore sopra non cambierà schermo e se lo aggiungi UNSPECIFIEDa switchdovrebbe mettere prima lo schermo in una posizione verticale / orizzontale .
mortalis

22

Laddove possibile, non utilizzare SCREEN_ORIENTATION_LANDSCAPE o SCREEN_ORIENTATION_PORTRAIT. Usa invece:

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

Questi consentono all'utente di orientare il dispositivo rispettivamente in orientamento orizzontale o verticale. Se hai mai dovuto giocare a un gioco con un cavo di ricarica inserito nello stomaco, allora sai esattamente perché avere entrambi gli orientamenti disponibili è importante per l'utente.

Nota: per i telefoni, almeno diversi che ho controllato, consente solo la modalità verticale "con il lato destro in alto", tuttavia SENSOR_PORTRAIT funziona correttamente sui tablet.

Nota: questa funzione è stata introdotta nel livello API 9, quindi se devi supportare 8 o inferiore (non probabile a questo punto), usa invece:

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

19

Usalo per impostare l'orientamento dello schermo:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

o

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

e non dimenticare di aggiungere questo al tuo manifest:

android:configChanges = "orientation"

2
Hai bisogno di entrambi "orientation|screenSize", guarda qui: developer.android.com/guide/topics/resources/…
Benny

7

Un codice funzionante:

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

chiamare questo metodo nel clic del pulsante

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.