Wie kann ich die aktuelle Bildschirmausrichtung abrufen?

190

Ich möchte nur einige Flags setzen, wenn sich meine Ausrichtung im Querformat befindet, damit ich bei der Neuerstellung der Aktivität in onCreate () zwischen dem Laden im Hochformat und dem Querformat wechseln kann. Ich habe bereits eine Layout-Land-XML, die mein Layout verwaltet.

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

Wenn Sie onConfigurationChanged überschreiben, wird verhindert, dass meine Layout-Land-XML im Querformat geladen wird.

Ich möchte nur die aktuelle Ausrichtung meines Geräts in onCreate () abrufen. Wie kann ich das bekommen?

Sheehan Alam
quelle

Antworten:

474
Activity.getResources().getConfiguration().orientation
EboMike
quelle
8
Dies liefert nur zwei Werte ORIENTATION_PORTRAIT und ORIENTATION_LANDSCAPE. Gibt es eine Möglichkeit, alle vier Werte von ActivityInfo abzurufen? (Das ist auch LANDSCAPE_REVERSE und
PORTRAIT_REVERSE
18
@HRJ können Sie getWindowManager (). GetDefaultDisplay (). GetRotation ()
MKJParekh
24
getWindowManager (). getDefaultDisplay (). getRotation () gibt die Drehung in Bezug auf die "natürliche" Ausrichtung des Displays zurück, dh für ein Tablet wird Surface.ROTATION_0 im Querformat zurückgegeben, während für ein Mobiltelefon der gleiche Wert für zurückgegeben wird Porträt.
Zoltán
64
int orientation = this.getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
    // code for portrait mode
} else {
    // code for landscape mode
}

Wenn die Oberklasse von thisistContext

Daniel
quelle
28

Bei einigen Geräten void onConfigurationChanged()kann es zum Absturz kommen. Der Benutzer verwendet diesen Code, um die aktuelle Bildschirmausrichtung abzurufen.

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

Und verwenden

if (orientation==1)        // 1 for Configuration.ORIENTATION_PORTRAIT
{                          // 2 for Configuration.ORIENTATION_LANDSCAPE
   //your code             // 0 for Configuration.ORIENTATION_SQUARE
}
Sakthimuthiah
quelle
1
Bitte beachten Sie, dass getOrient.getWidth () und getOrient.getHeight () jetzt veraltet sind.
Valerybodak
Sollte als die richtige Antwort markiert werden, da dies viel detaillierter ist
Zapnologica
1
Sollte als richtige Antwort markiert sein und funktioniert unter allen Bedingungen am besten. Beachten Sie jedoch, dass getActivity (). GetWindowManager (). GetDefaultDisplay (). GetWidth () und getHeight () jetzt veraltet sind. Bitte verwenden Sie getSize (Point Outsize). Es kann als Übergabe eines neuen Punktobjekts verwendet werden, das seine x- und y-Elemente erhält.
Mahendra Chhimwal
wie Point outSize = neuer Punkt (); getOrient.getSize (outSize); if (outSize.x == outSize.y) return SQUARE;
Mahendra Chhimwal
Ich dachte, ich möchte darauf hinweisen, dass Configuration.ORIENTATION_SQUARE veraltet ist und während es 2013 möglicherweise als 0 definiert wurde, ist es als 3 definiert, während Configuration.ORIENTIATION_UNDEFINED als 0 definiert ist. Prost.
Dave
26
int rotation =  getWindowManager().getDefaultDisplay().getRotation();

Dies gibt alle Orientierung wie normal und umgekehrt

und damit umgehen wie

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;
}
AndroidBeginner
quelle
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

Dieser Befehl gibt den int-Wert 1 für Hochformat und 2 für Querformat zurück

Rudolf Coutinho
quelle
4

Falls jemand möchte erhalten sinnvolle Orientierungs Beschreibung (so weitergegeben onConfigurationChanged(..)mit jenen reverseLandscape, sensorLandscapeusw.), verwenden Sie einfachgetRequestedOrientation()

a.ch.
quelle
1

Verwenden Sie in Ihrer Aktivitätsklasse die folgende Methode:

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

Um zu deklarieren, dass Ihre Aktivität eine Konfigurationsänderung behandelt, bearbeiten Sie das entsprechende Element in Ihrer Manifestdatei, um das android:configChangesAttribut mit einem Wert einzuschließen, der die Konfiguration darstellt, die Sie behandeln möchten. Mögliche Werte sind in der Dokumentation für das android:configChangesAttribut aufgeführt (die am häufigsten verwendeten Werte sind "Ausrichtung", um Neustarts zu verhindern, wenn sich die Bildschirmausrichtung ändert, und "Tastatur ausgeblendet", um Neustarts zu verhindern, wenn sich die Verfügbarkeit der Tastatur ändert). Sie können mehrere Konfigurationswerte im Attribut deklarieren, indem Sie sie durch eine Pipe | trennen Charakter.

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

Das ist alles!!

DalveerSinghDaiya
quelle
0

Wenn Sie diese onConfigurationChanged-Methode überschreiben möchten und dennoch die grundlegenden Aufgaben ausführen möchten, sollten Sie super.onConfigyrationChanged () als erste Anweisung in der überschriebenen Methode verwenden.

Samarth S.
quelle
0

Ich möchte nur eine andere Alternative vorschlagen, die einige von Ihnen betrifft:

android:configChanges="orientation|keyboardHidden" 

impliziert, dass wir das zu injizierende Layout explizit deklarieren.

Für den Fall, dass wir die automatische Injektion dank der Layout-Land- und Layout-Ordner beibehalten möchten. Alles was Sie tun müssen, ist es zu onCreate hinzuzufügen:

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

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

Hier wird die Aktionsleiste je nach Ausrichtung des Telefons angezeigt oder nicht

Z3nk
quelle