Zmień orientację ekranu programowo za pomocą przycisku

Odpowiedzi:

216

Tak, jest wykonalne!

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

Skorzystaj z linku:

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

Hariharan
źródło
Dzięki. Ale czy ta funkcja musi być uruchomiona na zrootowanym urządzeniu? Wygląda na to, że nie działa na moim telefonie komórkowym, ale na moim zrootowanym tablecie.
Sam
Nie, to nie tak .. Właściwie przetestowałem kod w tym linku przed wysłaniem .. Działał na moim urządzeniu ..
Hariharan
ok, tak, masz rację. właśnie przetestowałem inne urządzenie i działa dobrze. cóż, mój Samsung Galaxy Nexus nie działa. Nie wiem dlaczego.
Sam
4
Dziękuję za odpowiedź. Ale to blokowanie aplikacji w tym trybie. Gdy użytkownik obraca urządzenie, ekran się nie obraca.
Eco4ndly
2
Jeśli ustawię orientację na poziomą programowo, tak jak ta odpowiedź, użytkownik nie będzie już mógł zmienić orientacji, obracając urządzenie. Jakiś sposób na rozwiązanie tego problemu? Chcę zrobić to, czego nauczono w tej odpowiedzi, ale kiedy użytkownik obróci urządzenie, będzie on ciągle zmieniać orientację.
Wkrótce Santos
36

Tak, możesz ustawić orientację ekranu programowo w dowolnym momencie, używając:

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

odpowiednio dla trybu poziomego i pionowego. Metoda setRequestedOrientation () jest dostępna dla klasy Activity , więc może być używana wewnątrz Twojego Activity.

I tak można uzyskać aktualną orientację ekranu i ustawić ją odpowiednio w zależności od jego aktualnego stanu:

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

Zaczerpnięte stąd: http://techblogon.com/android-screen-orientation-change-rotation-example/

EDYTOWAĆ

Możesz także uzyskać orientację ekranu za pomocą Configuration:

Activity.getResources().getConfiguration().orientation
Philipp Jahoda
źródło
3
Sugeruję użycie getRequestedOrientation()do uzyskania aktualnej orientacji ekranu: stackoverflow.com/a/21909327/1037294
a.ch.
getRequestedOrientation()wyświetla się UNSPECIFIEDpo uruchomieniu aplikacji. Tak więc z powyższym słuchaczem nie zmieni ekranu, a jeśli dodasz UNSPECIFIEDdo switchniego, powinien najpierw ustawić ekran w jednej z pozycji pionowej / poziomej .
mortalis
22

O ile to możliwe, nie używaj SCREEN_ORIENTATION_LANDSCAPE ani SCREEN_ORIENTATION_PORTRAIT. Zamiast tego użyj:

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

Umożliwiają one użytkownikowi ustawienie urządzenia odpowiednio w orientacji poziomej lub pionowej. Jeśli kiedykolwiek musiałeś grać w grę z kablem ładującym wbitym w żołądek, wiesz dokładnie, dlaczego dostępność obu orientacji jest ważna dla użytkownika.

Uwaga: co najmniej kilka telefonów, które sprawdziłem, zezwala tylko na tryb pionowy „prawą stroną do góry”, jednak SENSOR_PORTRAIT działa poprawnie na tabletach.

Uwaga: ta funkcja została wprowadzona na poziomie API 9, więc jeśli musisz obsługiwać 8 lub niższą wersję (mało prawdopodobne w tym momencie), zamiast tego użyj:

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);
Paweł
źródło
19

Użyj tego, aby ustawić orientację ekranu:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

lub

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

i nie zapomnij dodać tego do swojego manifestu:

android:configChanges = "orientation"
Sathya
źródło
2
Potrzebujesz obu "orientation|screenSize", spójrz tutaj: developer.android.com/guide/topics/resources/ ...
Benny
7

Działający kod:

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

wywołaj tę metodę za pomocą kliknięcia przycisku

Liya
źródło