Как заблокировать ориентацию экрана при отображении обратного пейзажа в андроиде? - PullRequest
2 голосов
/ 20 июня 2011

я пытаюсь заблокировать экран orientation в приложении для Android. Я использовал следующий код для блокировки ориентации экрана при срабатывании определенной кнопки.

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

Над кодом, работающим как для альбомной, так и для портретной ориентации экрана, но он не работает для реверсивного ландшафтного режима. В этом случае моя активность всегда меняется на orientation на режим по умолчанию landscape. display.getOrientation() всегда возвращают 3.
Как мне найти решение этой проблемы?

Ответы [ 6 ]

15 голосов
/ 17 февраля 2012

Я имел дело с той же проблемой, используя API 8. Похоже, что в режиме reserseLandscape, если вы вызовете

getResources().getConfiguration().orientation 

Android вернет 2 (SCREEN_ORIENTATION_USER), который не заблокирует ориентациюсовсем.Фактически константа SCREEN_ORIENTATION_REVERSE_LANDSCAPE даже не определена для класса ActivityInfo, даже если значение действительно существует.Для моего приложения в итоге я создал этот метод:

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

Я вызываю этот метод всякий раз, когда мне нужно заблокировать ориентацию, а затем я могу просто отпустить его, вызывая

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

Надеюсь, чтопомогает.

3 голосов
/ 09 июля 2014
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); 
    }
}

Ответ autremoi работал для меня, я создал новый ответ, потому что моя репутация пока не позволяет мне голосовать за него.

Единственное отличие в моем коде состоит в том, что я восстанавливаю датчик сэтот другой

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
0 голосов
/ 01 января 2015

Я попробовал ответ autremoi, но он убил мой пользовательский интерфейс.Я нашел ответ, который работает, однако я обнаружил, что сочетание этого: http://www.captechconsulting.com/blog/eric-miles/programmatically-locking-android-screen-orientation

и этого: getSize (), выдающего мне ошибки , работает и должно работать на всехВерсии для Android.

Используйте его с setRequestedOrientation(lockOrientation());

Удачного кодирования!

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;
}
0 голосов
/ 04 февраля 2014

В вашем файле AndroidManifest просто введите следующие коды:

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

пример:

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

Это работает на меня.Надеюсь, это поможет!

0 голосов
/ 20 июня 2011

попробуйте

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

, если хотите портрет

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
0 голосов
/ 20 июня 2011

привет, если вы хотите заблокировать ориентацию экрана, вам нужно установить файл манифеста

<activity android:configChanges="orientation|keyboardHidden"
        android:screenOrientation="portrait" android:name=".activities.HomeActivity"
        android:label="@string/app_name" android:theme="@style/Theme.Translucent">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...