Как я могу повернуть отображение только в ландшафтном режиме в Android? - PullRequest
24 голосов
/ 21 марта 2011

Я хочу, чтобы мой просмотр вращался только в ландшафтном режиме, по часовой стрелке и против часовой стрелки.

Я прочитал о единственном против часовой стрелки для Android <2.2, и это не проблема, мое приложение пока будет +2.2. </p>

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

android:configChanges="keyboardHidden|orientation"

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

@Override
public void onConfigurationChanged(Configuration newConfig) {

, и я знаю, как ловить ориентацию

Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
int rot = display.getRotation();

но ... я не знаю, как вызвать подходящую альбомную ориентацию, я делаю это:

if (rot == Surface.ROTATION_90 || rot == Surface.ROTATION_270){
  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}

, но всегда поворачиваюсь против часовой стрелки: - (

Как я могу установить левую и правую альбомную ориентацию?

РЕДАКТИРОВАТЬ

Если я устанавливаю ориентацию в манифесте:

android: screenOrientation = "landscape "

Макет действия всегда остается в" левом ландшафте ", и я хочу изменить между левым и правым ландшафтом: S

Ответы [ 4 ]

58 голосов
/ 13 января 2012

Если вы создаете свое приложение для Android 2.3 и новее, вы должны установить атрибут manifest как

андроида: screenOrientation = "sensorLandscape"

и ваше приложение переместится в (левую или правую) альбомную позицию.

Если вы создаете свое приложение для Android 2.2 и старше, но хотите запустить его на Android 2.3 и новее в конфигурации «sensorLandscape», вы можете попробовать что-то вроде этого

public static final int ANDROID_BUILD_GINGERBREAD = 9;
public static final int SCREEN_ORIENTATION_SENSOR_LANDSCAPE = 6;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (Build.VERSION.SDK_INT >= ANDROID_BUILD_GINGERBREAD) {
        setRequestedOrientation(SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
    }
...

Это был лучший способ справиться с изменениями альбомной ориентации в моем случае. Я не смог найти лучшего способа поворота экрана в левую или правую альбомную ориентацию для Android 2.2 и старше. Я попытался прочитать ориентацию датчика и установить альбомную позицию на основе этого, но мне кажется, что, как только вы вызовете "setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);" датчик отключается (для вашего приложения / деятельности), и вы не можете прочитать ориентацию через датчик.

Кстати, вам не нужно переопределять «onConfigurationChanged (Configuration newConfig)» для того, чтобы все это работало должным образом.

6 голосов
/ 05 марта 2015

В декларации активности вашего манифеста вместо

android:screenOrientation = "landscape"

использование

android:screenOrientation = "sensorLandscape"

1 голос
/ 21 марта 2011

Вы пытались добавить это в манифест внутри тега активности, чтобы посмотреть, обрабатывает ли он его автоматически?

android:screenOrientation = "landscape"
0 голосов
/ 21 марта 2011

AndroidManifest.xml -> Приложение -> выбрал вашу деятельность -> Ориентация экрана = ландшафт.

...