2 Stimmen

Wie sperrt man die Bildschirmausrichtung bei der Anzeige im Querformat in Android?

Ich versuche, den Bildschirm zu sperren orientation Ich habe den folgenden Code verwendet, um die Bildschirmausrichtung zu sperren, wenn eine bestimmte Schaltfläche angeklickt wird.

// Inside button click

Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
 if (display.getOrientation() == 1) {
                   setRequestedOrientation(0);
 } else if (display.getOrientation() == 0) {
                   setRequestedOrientation(1);
 } else if (display.getOrientation() == 3) {
                   setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
 }

Der obige Code funktioniert sowohl im Hoch- als auch im Querformat, aber er funktioniert nicht im umgekehrten Querformat, d.h. meine Aktivität ändert sich immer orientation auf Standard landscape Außerdem stelle ich fest, dass das Gerät im umgekehrten Querformat arbeitet, display.getOrientation() immer 3 zurückgeben.
Wie kann ich eine Lösung für dieses Problem finden?

15voto

autremoi Punkte 261

Ich habe mit dem gleichen Problem zu kämpfen, wenn ich API 8 verwende. Es sieht so aus, dass im reserseLandscape-Modus, wenn man

getResources().getConfiguration().orientation 

Android gibt 2 (SCREEN_ORIENTATION_USER) zurück, wodurch die Ausrichtung nicht gesperrt wird. Tatsächlich ist die Konstante SCREEN_ORIENTATION_REVERSE_LANDSCAPE nicht einmal für die ActivityInfo-Klasse definiert, obwohl der Wert tatsächlich existiert. Für meine Anwendung habe ich schließlich diese Methode erstellt:

public void lockScreenOrientation() {
    switch (((WindowManager) getSystemService(WINDOW_SERVICE))
        .getDefaultDisplay().getRotation()) {
    case Surface.ROTATION_90: 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
        break;
    case Surface.ROTATION_180: 
        setRequestedOrientation(9/* reversePortait */); 
        break;          
    case Surface.ROTATION_270: 
        setRequestedOrientation(8/* reverseLandscape */); 
        break;
    default : 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    }
}

Ich rufe diese Methode immer dann auf, wenn ich die Ausrichtung sperren muss, und dann kann ich sie einfach freigeben, indem ich

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

Ich hoffe, es hilft.

3voto

Rako Punkte 61
public void lockScreenOrientation() {
    switch (((WindowManager) getSystemService(WINDOW_SERVICE))
        .getDefaultDisplay().getRotation()) {
    case Surface.ROTATION_90: 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
        break;
    case Surface.ROTATION_180: 
        setRequestedOrientation(9/* reversePortait */); 
        break;          
    case Surface.ROTATION_270: 
        setRequestedOrientation(8/* reverseLandscape */); 
        break;
    default : 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    }
}

Die Antwort von autremoi hat bei mir funktioniert, ich habe eine neue Antwort erstellt, weil mein Ruf mich ihn noch nicht hochwählen lässt.

Der einzige Unterschied in meinem Code ist, dass ich den Sensor mit diesem anderen wiederherstelle

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

0voto

user2680756 Punkte 3

Geben Sie in Ihrer AndroidManifest-Datei einfach die folgenden Codes ein:

        android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
        android:screenOrientation="reverseLandscape"

Beispiel:

    <activity
        android:name="com.gaspar.slinfilipino.Quiz"
        android:label="@string/title_activity_quiz"
        android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
        android:screenOrientation="reverseLandscape"
        android:parentActivityName="com.gaspar.slinfilipino.SignLanguageMenu" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.gaspar.slinfilipino.SignLanguageMenu" />
    </activity>

Es funktioniert bei mir. Hoffentlich hilft es!

0voto

tricknology Punkte 985

Ich habe die Antwort von autremoi ausprobiert, aber sie hat meine UI zerstört. Ich fand eine Antwort, die funktioniert, aber ich fand, dass eine Mischung aus diesem: https://www.captechconsulting.com/blogs/programmatically-locking-Android-screen-orientation

und dies: getSize() gibt mir Fehler funktioniert und sollte auf allen Android-Versionen funktionieren.

Verwenden Sie es mit setRequestedOrientation(lockOrientation());

Viel Spaß beim Codieren!

private int lockOrientation(){
    Display display = getWindowManager().getDefaultDisplay();
    int rotation = display.getRotation();

    Point size = new Point();
    size.x = display.getWidth();
    size.y = display.getHeight();

    int lock = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;

    if (rotation == Surface.ROTATION_0
            || rotation == Surface.ROTATION_180) {
        // if rotation is 0 or 180 and width is greater than height, we have
        // a tablet
        if (size.x > size.y) {
            if (rotation == Surface.ROTATION_0) {
                lock = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            } else {
                lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
            }
        } else {
            // we have a phone
            if (rotation == Surface.ROTATION_0) {
                lock = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
            } else {
                lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
            }
        }
    } else {
        // if rotation is 90 or 270 and width is greater than height, we
        // have a phone
        if (size.x > size.y) {
            if (rotation == Surface.ROTATION_90) {
                lock = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            } else {
                lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
            }
        } else {
            // we have a tablet
            if (rotation == Surface.ROTATION_90) {
                lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
            } else {
                lock = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
            }
        }
    }
    return lock;
}

-1voto

kannappan Punkte 2254

Hallo, wenn Sie die Ausrichtung des Sperrbildschirms wünschen, müssen Sie die Manifestdatei einstellen.

<activity android:configChanges="orientation|keyboardHidden"
        android:screenOrientation="portrait" android:name=".activities.HomeActivity"
        android:label="@string/app_name" android:theme="@style/Theme.Translucent">

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X