Програмно змінюйте орієнтацію екрана за допомогою кнопки


Відповіді:


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-programmatic.html


Дякую. Але це функція, яку потрібно запускати на вкоріненому пристрої? Здається, працює не на мобільному телефоні, а на моєму вкоріненому планшеті.
Сем

Ні, це не так. Насправді я перевірив код у цьому посиланні перед публікацією .. Він працював на моєму пристрої ..
Харіхаран

добре, так, ти маєш рацію. Я щойно перевірив інший пристрій, і він працює добре. добре, мій Samsung Galaxy Nexus не працює. Не знаю чому.
Сем

4
Дякую за відповідь. Але це блокування програми в тому режимі. Коли користувач обертає пристрій, екран не обертається.
Eco4ndly

2
Якщо я задаю орієнтацію на краєвид програмно як цю відповідь, користувач більше не може змінити орієнтацію, обертаючи пристрій. Будь-який спосіб вирішити цю проблему? Я хочу зробити те, про що вчили у цій відповіді, але тоді, коли користувач поверне пристрій, він буде змінювати орієнтацію.
Незабаром Сантос,

36

Так, ви можете встановити орієнтацію екрана програмно в будь-який час, коли вам потрібно:

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

для ландшафтного та портретного режимів відповідно. Метод setRequestedOrientation () доступний для класу 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/

EDIT

Крім того, ви можете отримати орієнтацію екрана, використовуючи Configuration:

Activity.getResources().getConfiguration().orientation

3
Я запропонував би використовувати , getRequestedOrientation()щоб отримати поточну орієнтацію екрану: stackoverflow.com/a/21909327/1037294
А.Х.

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

викликайте цей метод натисканням кнопки

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.