2013年4月更新:不要这样做。当我第一次回答这个问题时,它并不是一个好主意,现在也不是。请参考hackbod的答案以了解原因:
避免在Android设备方向改变时使用asynctask重新载入activity
在您的AndroidManifest.xml中添加 android:configChanges="keyboardHidden|orientation"
。这告诉系统您将自行处理哪些配置更改 - 在本例中不做任何操作。
<activity android:name="MainActivity"
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation">
了解更多细节,请参阅开发人员参考configChanges。
然而,您的应用程序可能随时被打断,例如通过电话,因此当应用程序被暂停时,您真的应该添加保存应用程序状态的代码。
更新:从Android 3.2开始,您还需要添加“screenSize”:
<activity
android:name="MainActivity"
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation|screenSize">
来自开发人员指南 手动处理配置更改。
注意:从Android 3.2(API级别13)开始,设备在纵向和横向方向切换时,"屏幕尺寸"也会改变。因此,如果您想防止由于方向更改而发生运行时重启(针对minSdkVersion和targetSdkVersion属性声明的API级别为13或更高),则必须除了"orientation"值之外还包括"screenSize"值。也就是说,您必须声明
android:configChanges="orientation|screenSize"
。但是,如果您的应用程序针对API级别12或更低,则您的activity总是自己处理此配置更改(即使在Android 3.2或更高版本的设备上运行,此配置更改也不会重新启动activity)。
您需要修改AndroidManifest.xml文件,如Intrications(以前是Ashton)所提到的,并确保活动处理onConfigurationChanged事件的方式符合您的要求。以下是应该看起来的样子:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
setRequestedOrientation()
放在onCreate()
中。 - TimmmmonConfigurationChanged()
会在onCreate()
之前被调用,那么在onCreate()
中设置内容视图之前设置方向是更好的方法。将配置设置放在应该设置的位置也更加清晰,因此此答案仍然是正确的。 - Samuel我一直认为需要两者兼备
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
中会导致应用程序先转换到纵向模式,然后再转换回横向模式(这只会发生一次,但很烦人)。因此使用下面的方法更好:
还可以在清单文件中为您的活动设置 android:screenOrientation="nosensor"
。 但是,使用此方法将无法处理方向更改。
使用此功能可轻松完成任务。
android:screenOrientation="portrait"
在您的Activity的OnCreate方法中使用以下代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
现在你的屏幕方向已经设置为竖屏,并且将永远保持不变。
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);
}
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);
}
android:configChanges="keyboardHidden|orientation|screenSize"