Программное изменение ориентации экрана с помощью кнопки

Ответы:

216

Да, это возможно!

ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

ActivityInfo

http://developer.android.com/reference/android/content/pm/ActivityInfo.html

Ссылка:

Button buttonSetPortrait = (Button)findViewById(R.id.setPortrait);
Button buttonSetLandscape = (Button)findViewById(R.id.setLandscape);

buttonSetPortrait.setOnClickListener(new Button.OnClickListener(){

   @Override
   public void onClick(View arg0) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
   }

});

buttonSetLandscape.setOnClickListener(new Button.OnClickListener(){

   @Override
   public void onClick(View arg0) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
   }

});

http://android-er.blogspot.in/2011/08/set-screen-orientation-programmatically.html

Харихаран
источник
Спасибо. Но нужно ли запускать эту функцию на корневом устройстве? Кажется, он работает не на моем мобильном телефоне, а на моем рутированном планшете.
Сэм
Нет, это не так .. На самом деле я протестировал код в этой ссылке перед публикацией .. Он работал на моем устройстве ..
Харихаран
хорошо, да, ты прав. Я только что протестировал другое устройство, и оно работает хорошо. ну, мой Samsung Galaxy Nexus не работает. Не знаю почему.
Сэм
4
Спасибо за ответ. Но это блокировка приложения в этом режиме. Когда пользователь поворачивает устройство, экран не вращается.
Eco4ndly
2
Если я программно установлю альбомную ориентацию в качестве этого ответа, пользователь больше не сможет изменить ориентацию, поворачивая устройство. Есть ли способ справиться с этой проблемой? Я хочу сделать то, что было сказано в этом ответе, но затем, когда пользователь поворачивает устройство, он будет продолжать менять ориентацию.
Скоро Сантос
36

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

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

для ландшафтного и портретного режима соответственно. Метод setRequestedOrientation () доступен для класса Activity , поэтому его можно использовать внутри вашей Activity.

И вот как вы можете получить текущую ориентацию экрана и адекватно ее установить в зависимости от его текущего состояния:

Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
final int orientation = display.getOrientation(); 
 // OR: orientation = getRequestedOrientation(); // inside an Activity

// set the screen orientation on button click
Button btn = (Button) findViewById(R.id.yourbutton);
btn.setOnClickListener(new View.OnClickListener() {
          public void onClick(View v) {

              switch(orientation) {
                   case Configuration.ORIENTATION_PORTRAIT:
                       setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                       break;
                   case Configuration.ORIENTATION_LANDSCAPE:
                       setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                       break;                   
               }
          }
   });

Взято отсюда: http://techblogon.com/android-screen-orientation-change-rotation-example/

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

Также вы можете получить ориентацию экрана, используя Configuration:

Activity.getResources().getConfiguration().orientation
Филипп Яхода
источник
3
Я бы предложил использовать getRequestedOrientation()для получения текущей ориентации экрана: stackoverflow.com/a/21909327/1037294
a.ch.
getRequestedOrientation()выдает UNSPECIFIEDпри запуске приложения. Таким образом, с указанным выше слушателем он не изменит экран, и если вы добавите UNSPECIFIEDк switchнему, он должен сначала поместить экран в одну из портретных / альбомных позиций.
Mortalis
22

По возможности не используйте SCREEN_ORIENTATION_LANDSCAPE или SCREEN_ORIENTATION_PORTRAIT. Вместо этого используйте:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);

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

Примечание. Для телефонов, по крайней мере для нескольких из тех, что я проверил, разрешен только портретный режим «правой стороной вверх», однако SENSOR_PORTRAIT работает правильно на планшетах.

Примечание: эта функция была введена в API уровня 9, поэтому, если вы должны поддерживать 8 или ниже (маловероятно на данном этапе), используйте вместо этого:

setRequestedOrientation(Build.VERSION.SDK_INT < 9 ?
                        ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE :
                        ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
setRequestedOrientation(Build.VERSION.SDK_INT < 9 ?
                        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT :
                        ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
Павел
источник
19

Используйте это, чтобы установить ориентацию экрана:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

или

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

и не забудьте добавить это в свой манифест:

android:configChanges = "orientation"
Сатья
источник
2
Вам нужны оба "orientation|screenSize", смотрите здесь: developer.android.com/guide/topics/resources/…
Бенни,
7

Рабочий код:

private void changeScreenOrientation() {
    int orientation = yourActivityName.this.getResources().getConfiguration().orientation;
    if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        showMediaDescription();
    } else {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        hideMediaDescription();
    }
    if (Settings.System.getInt(getContentResolver(),
            Settings.System.ACCELEROMETER_ROTATION, 0) == 1) {
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
            }
        }, 4000);
    }
}

вызовите этот метод при нажатии кнопки

Лия
источник