如何禁用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屏幕方向。