如何禁用Android上的方向更改?
我有一个应用程序,我只是想在肖像模式下使用,所以我在清单XML中定义了android:screenOrientation =“portrait”。 这对HTC Magic手机可以正常工作(并防止其他手机的方向更改)。
但是当我打开硬件QWERTY键盘 (而不是虚拟键盘)时,我遇到了HTC G1手机的问题。 我的活动停留在肖像模式,但似乎重新启动,并失去了所有的状态。 HTC Hero版本不会发生这种情况。
我的应用程序是相当大的,所以我不希望它重新启动,并在键盘打开时失去其所有的状态。 我怎样才能防止呢?
2013年4月更新:不要这样做。 2009年我第一次回答这个问题并不是一个好主意,现在真的不是一个好主意。 看到这个答案由hackbod的原因: https ://stackoverflow.com/a/5336057/84021
将android:configChanges="keyboardHidden|orientation"到您的AndroidManifest.xml中。 这告诉系统你将要处理的configuration变化 – 在这种情况下什么也不做。 
 <activity android:name="MainActivity" android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation"> 
有关更多详细信息,请参阅http://developer.android.com/reference/android/R.attr.html#configChanges 。
但是,您的应用程序可能随时中断,例如通过电话,所以您应该添加代码以在应用程序暂停时保存应用程序的状态。
更新:从Android 3.2开始,您还需要添加“screenSize”:
 <activity android:name="MainActivity" android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation|screenSize"> 
从http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange :
注意:从Android 3.2(API级别13)开始,当设备在纵向和横向之间切换时,“屏幕大小”也会改变。 因此,如果要在API级别13或更高级别(由minSdkVersion和targetSdkVersion属性声明)开发时防止由于方向更改导致运行时重新启动,则除“方向”值外,还必须包含“screenSize”值。 也就是说,你必须声明
android:configChanges="orientation|screenSize"。 但是,如果您的应用程序的目标级别为12或更低,那么您的活动始终会自行处理此configuration更改(即使在Android 3.2或更高版本的设备上运行,此configuration更改也不会重新启动您的活动)。
您需要将AndroidManifest.xml修改为Intrications (之前为Ashton),并确保活动处理onConfigurationChanged事件。 这应该是这样的:
 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } 
我一直觉得你们都需要
 android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation" 
 如上所述,将您的Activity(在清单文件中)的android:configChanges设置为keyboardHidden|orientation ,然后: 
  1)覆盖onConfigurationChanged() 
 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); //here you can handle orientation change } 
  2)将此行添加到您的活动的onCreate() 
 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
 这比在onConfigurationChanged添加同一行onConfigurationChanged ,因为你的应用程序将转向肖像模式,然后回到风景(它只会发生一次,但它很烦人)。 
 你也可以设置android:screenOrientation="nosensor"你的活动(在清单)。  但是用这种方法你根本就无法处理方位的变化。 
用这个..
  android:screenOrientation="portrait" 
在您的活动的OnCreate方法使用此代码:
  @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
现在你的方向将被设置为肖像,永远不会改变。
 在AndroidManifest.xml文件中,为每个要locking的活动添加最后一个screenOrientation行: 
 android:label="@string/app_name" android:name=".Login" android:screenOrientation="portrait" > 
或android:screenOrientation =“landscape” 。
在你的androidmanifest.xml文件中:
  <activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation"> 
要么
 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } 
要通过代码locking屏幕,您必须使用屏幕的实际旋转angular度(0,90,180,270),并且您必须知道它的自然位置,在智能手机中,自然位置将是肖像和平板电脑,这将是景观。
这里是代码(locking和解锁方法),它已经在一些设备(智能手机和平板电脑)中testing过,效果很好。
 public static void lockScreenOrientation(Activity activity) { WindowManager windowManager = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE); Configuration configuration = activity.getResources().getConfiguration(); int rotation = windowManager.getDefaultDisplay().getRotation(); // Search for the natural position of the device if(configuration.orientation == Configuration.ORIENTATION_LANDSCAPE && (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) || configuration.orientation == Configuration.ORIENTATION_PORTRAIT && (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270)) { // Natural position is Landscape switch (rotation) { case Surface.ROTATION_0: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); break; case Surface.ROTATION_90: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); break; case Surface.ROTATION_180: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); break; case Surface.ROTATION_270: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); break; } } else { // Natural position is Portrait switch (rotation) { case Surface.ROTATION_0: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); break; case Surface.ROTATION_90: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); break; case Surface.ROTATION_180: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); break; case Surface.ROTATION_270: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); break; } } } public static void unlockScreenOrientation(Activity activity) { activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); } 
在Visual Studio中Xamarin:
- 加:
 using Android.Content.PM; 给你的活动命名空间列表。 
- 加:
 [Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)] 
作为你们class的一个属性,就像这样:
 [Activity(ScreenOrientation = ScreenOrientation.Portrait)] public class MainActivity : Activity {...} 
加
 android:configChanges="keyboardHidden|orientation|screenSize" 
到你的清单。
请注意,没有任何方法现在似乎工作!
 在Android Studio 1中,一个简单的方法是添加android:screenOrientation="nosensor" 。 
这有效地locking屏幕方向。