2011-10-07 109 views
14

我希望我的活動只能在縱向模式和反向肖像兩種模式下使用。我怎樣才能做到這一點?當我設置android:screenOrientation="portrait"它將強制活動只在正常肖像 - 反之亦然reversePortrait。縱向或反向縱向活動僅限

請不要告訴我這是強制/鎖定方向的不好方法。我知道這件事,但仍然有客戶要求。感謝您的理解和任何想法。

UPDATE: API級別11和更高

+4

個不錯的辦法IMO,一些應用程序/遊戲只是不會就在某些方向上工作。 – Ricky

+0

非常感謝瑞奇。我剛看到有人在類似的帖子上爭論,所以我想澄清一下,我真的只需要肖像。 – Speedy

+0

很多電子商務應用程序太鎖定方向 – Killer

回答

37

如果您在API層面9+,使用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

謝謝!!!我必須失明,我錯過了這個價值!是的,我在API 11+上,所以這個工作很完美。 – Speedy

+4

我必須在api 15上使用拼寫錯誤的版本「sensorPortait」。 – Richard

+0

這會旋轉視圖,但不會觸發任何事件。我需要在方向從正常切換到反向視圖時捕捉事件。怎麼做? – StarDust

1

AndroidManifest.xml

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

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

你可以試試這個:)

+0

謝謝,這是一個很好的答案,但因爲我忘記告訴我API 11+(蜂窩),alextc的答案更適合我,並且效果很好。我不知道爲什麼,但當我嘗試使用|時出現AAPT錯誤在screenOrientation,所以我不能使用兩個值,但只有一個:( – Speedy

+12

@xjaphx,android:screenOrientation =「portrait | reversePortrait」,這是行不通的,出現以下錯誤:「error:Error:String types not allowed ('screenOrientation',值爲'portrait | reversePortrait')「 –

+0

@PaulAnnekov因爲它是一個簡單的枚舉,所以你不能使用」|「 –

1

爲後人的緣故,我用這個向後兼容...

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

使用

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