2011-10-07 13 views
14

Chcę, aby moja aktywność była dostępna tylko w obu trybach portretu - portret i odwróć portret. Jak mogę to osiągnąć? Kiedy ustawię android:screenOrientation="portrait", wymusi on aktywność tylko w normalnym portretie - vice versa with reversePortrait.Aktywność tylko w orientacji pionowej lub portretowej

Proszę, nie mówcie mi, że to złe podejście do orientacji siłowej/blokującej. Wiem o tym, ale wciąż żąda tego klient. Dzięki za zrozumienie i za wszelkie pomysły.

UPDATE: API Level 11 i wyższe

+4

Nie jest to złe podejście IMO, niektóre aplikacje/gry po prostu nie będzie działać prawo w pewnych orientacjach. – Ricky

+0

Dziękuję Ricky, dokładnie. Widziałem ludzi, którzy kłócili się o podobne posty, więc chciałem wyjaśnić, że naprawdę potrzebuję tylko portretu. – Speedy

+0

wiele aplikacji e-commerce również blokuje orientację – Killer

Odpowiedz

37

Jeśli jesteś na poziomie API 9+, użyj android:screenOrientation="sensorPortrait".

Portrait orientation, but can be either normal or reverse portrait based on the device sensor. Added in API level 9.

Documentation

+0

Dziękujemy! Muszę być ślepy, że straciłem tę wartość! Tak, jestem w API 11+, więc to działa idealnie. – Speedy

+4

Musiałem użyć wersji literówki "sensorPortait" na api 15. – Richard

+0

Powoduje to obrócenie widoku w porządku, ale nie powoduje żadnego zdarzenia. Muszę uchwycić zdarzenie, gdy orientacja zmienia się z normalnego na odwrotny. Jak to zrobić? – StarDust

1

W AndroidManifest.xml:

android:screenOrientation="portrait|reversePortrait" 
android:configuration="keyboardHidden|orientation" 

W swojej WhateverActivity.java:

protected void onConfigurationChanged(Configuration newConfig) { 
    int currentOrientation = getResources().getConfiguration().orientation; 
    if(newConfig.orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT || 
     newConfig.orientation == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT) { 
     super.onConfigurationChanged(newConfig); 
    } 
} 

Można spróbować tego :)

+0

Dzięki, to jest dobra odpowiedź, ale jak zapomniałem powiedzieć, że jestem na API 11+ (Honeycomb) odpowiedź alextc jest bardziej odpowiednia dla mnie i działa świetnie. I nie wiem dlaczego, ale mam błąd AAPT, kiedy próbuję użyć | w screenOrientation, więc nie mogłem użyć dwóch wartości, ale tylko jeden :( – Speedy

+12

@xjaphx, android: screenOrientation = "portrait | reversePortrait". To nie działa. Pojawia się następujący błąd: "error: Error: String types not allowed (w "screenOrientation" z wartością "portrait | reversePortrait") ". –

+0

@PaulAnnekov Nie, ponieważ jest to proste wyliczenie, więc nie można użyć kombinacji wartości za pomocą" | " –

1

Dla dobra potomności za używam to dla wstecznej kompatybilności ...

public final class OrientationHelper { 

    @TargetApi(Build.VERSION_CODES.GINGERBREAD) 
    public static void setRequestedOrientationSensorPortrait(Activity activity) { 
     if (Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) { 
      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); 
     } else { 
      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     } 
    } 

    @TargetApi(Build.VERSION_CODES.GINGERBREAD) 
    public static void setRequestedOrientationSensorLandscape(Activity activity) { 
     if (Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) { 
      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 
     } else { 
      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
     } 
    } 
} 

Wykorzystanie

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    OrientationHelper.setRequestedOrientationSensorPortrait(this); 
    super.setContentView(R.layout.my_layout); 
} 
Powiązane problemy