如何禁用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:

  1. 加:

using Android.Content.PM; 给你的活动命名空间列表。

  1. 加:

[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屏幕方向。