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.