Come posso ottenere l'attuale orientamento dello schermo?


190

Voglio solo impostare alcune bandiere quando il mio orientamento è in orizzontale in modo che quando l'attività viene ricreata in onCreate () posso passare da cosa caricare in verticale rispetto a orizzontale. Ho già un xml layout-land che gestisce il mio layout.

public void onConfigurationChanged(Configuration _newConfig) {

        if (_newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            this.loadURLData = false;
        }

        if (_newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            this.loadURLData = true;
        }

        super.onConfigurationChanged(_newConfig);
    }

L'over-ride di ConfigurationChanged impedirà il caricamento del mio xml layout-land in orientamento orizzontale.

Voglio solo ottenere l'orientamento corrente del mio dispositivo in onCreate (). Come posso ottenerlo?

Risposte:


475
Activity.getResources().getConfiguration().orientation

8
Ciò fornisce solo due valori ORIENTATION_PORTRAIT e ORIENTATION_LANDSCAPE. C'è un modo per ottenere tutti e quattro i valori da ActivityInfo? (Sono LANDSCAPE_REVERSE e PORTRAIT_REVERSE)
HRJ,

18
@HRJ puoi usare getWindowManager (). GetDefaultDisplay (). GetRotation ()
MKJParekh

24
getWindowManager (). getDefaultDisplay (). getRotation () restituisce la rotazione con riferimento all'orientamento "naturale" del display, ovvero per un tablet restituire Surface.ROTATION_0 in modalità orizzontale, mentre per un telefono cellulare restituirebbe lo stesso valore per ritratto.
Zoltán,

65
int orientation = this.getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
    // code for portrait mode
} else {
    // code for landscape mode
}

Quando la superclasse di thisèContext


28

In alcuni dispositivi void onConfigurationChanged()potrebbe bloccarsi. L'utente utilizzerà questo codice per ottenere l'orientamento corrente dello schermo.

public int getScreenOrientation()
{
    Display getOrient = getActivity().getWindowManager().getDefaultDisplay();
    int orientation = Configuration.ORIENTATION_UNDEFINED;
    if(getOrient.getWidth()==getOrient.getHeight()){
        orientation = Configuration.ORIENTATION_SQUARE;
    } else{ 
        if(getOrient.getWidth() < getOrient.getHeight()){
            orientation = Configuration.ORIENTATION_PORTRAIT;
        }else { 
             orientation = Configuration.ORIENTATION_LANDSCAPE;
        }
    }
    return orientation;
}

E usare

if (orientation==1)        // 1 for Configuration.ORIENTATION_PORTRAIT
{                          // 2 for Configuration.ORIENTATION_LANDSCAPE
   //your code             // 0 for Configuration.ORIENTATION_SQUARE
}

1
Si noti che getOrient.getWidth () e getOrient.getHeight () ora sono obsoleti.
valerybodak,

Dovrebbe essere contrassegnato come la risposta corretta come è molto più dettagliato
Zapnologica

1
Dovrebbe essere contrassegnato come risposta corretta e funziona meglio in tutte le condizioni. Ma tieni presente che come anivaler ha detto che getActivity (). GetWindowManager (). GetDefaultDisplay (). GetWidth () e getHeight () ora sono obsoleti. Si prega di utilizzare getSize (Point outsize). Può essere usato come passaggio di un nuovo oggetto punto e otterrà i suoi membri xey.
Mahendra Chhimwal,

come Point outSize = new point (); getOrient.getSize (outSize); if (outSize.x == outSize.y) restituisce SQUARE;
Mahendra Chhimwal,

Pensavo di sottolineare che Configuration.ORIENTATION_SQUARE è obsoleto e sebbene sia stato definito come 0 nel 2013, è definito come 3, mentre Configuration.ORIENTIATION_UNDEFINED è definito come 0. Saluti.
Dave,

26
int rotation =  getWindowManager().getDefaultDisplay().getRotation();

questo darà tutto l'orientamento come normale e inverso

e gestirlo come

int angle = 0;
switch (rotation) {
    case Surface.ROTATION_90:
        angle = -90;
        break;
    case Surface.ROTATION_180:
        angle = 180;
        break;
    case Surface.ROTATION_270:
        angle = 90;
        break;
    default:
        angle = 0;
        break;
}

final int angle = (rotation == Surface.ROTATION_90) ? 90 : (rotation == Surface.ROTATION_180) ? 180 : (rotation == Surface.ROTATION_270) ? 270 : 0;
Andrey Syrokomskiy,

12
getActivity().getResources().getConfiguration().orientation

questo comando restituisce il valore int 1 per Verticale e 2 per Orizzontale



1

Nella tua classe di attività usa il metodo seguente:

 @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

            setlogo();// Your Method
            Log.d("Daiya", "ORIENTATION_LANDSCAPE");

        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {

            setlogoForLandScape();// Your Method
            Log.d("Daiya", "ORIENTATION_PORTRAIT");
        }
    }

Quindi per dichiarare che la tua attività gestisce una modifica della configurazione, modifica l'elemento appropriato nel tuo file manifest per includere l' android:configChangesattributo con un valore che rappresenti la configurazione che desideri gestire. I valori possibili sono elencati nella documentazione per l' android:configChangesattributo (i valori più comunemente usati sono "orientamento" per impedire il riavvio quando cambia l'orientamento dello schermo e "keyboardHidden" per impedire il riavvio quando cambia la disponibilità della tastiera). È possibile dichiarare più valori di configurazione nell'attributo separandoli con una pipe | carattere.

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">

È tutto!!


0

se si desidera sovrascrivere quel metodo onConfigurationChanged e si desidera ancora che esegua le operazioni di base, considerare l'utilizzo di super.onConfigyrationChanged () come prima istruzione nel metodo overriden.


0

Voglio solo proporre un'altra alternativa che riguarderà alcuni di voi:

android:configChanges="orientation|keyboardHidden" 

implica che dichiariamo esplicitamente il layout da iniettare.

Nel caso in cui vogliamo mantenere l'iniezione automatica grazie alle cartelle layout-land e layout. Tutto quello che devi fare è aggiungerlo a onCreate:

    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
        getSupportActionBar().hide();

    } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        getSupportActionBar().show();
    }

Qui, visualizziamo o meno la barra delle azioni in base all'orientamento del telefono

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.