我有一个我只想在纵向模式下使用的应用程序,因此我在清单XML中定义了android:screenOrientation =“ portrait”。对于HTC Magic手机,这可以正常工作(并且还可以防止其他手机的方向更改)。
但是,当我打开硬件QWERTY键盘(不是虚拟键盘)时,HTC G1手机出现了问题。我的活动保持纵向模式,但似乎重新启动并失去所有状态。HTC Hero版本不会发生这种情况。
我的应用程序很大,所以我不希望它在打开键盘时重新启动并丢失所有状态。我该如何预防?
我有一个我只想在纵向模式下使用的应用程序,因此我在清单XML中定义了android:screenOrientation =“ portrait”。对于HTC Magic手机,这可以正常工作(并且还可以防止其他手机的方向更改)。
但是,当我打开硬件QWERTY键盘(不是虚拟键盘)时,HTC G1手机出现了问题。我的活动保持纵向模式,但似乎重新启动并失去所有状态。HTC Hero版本不会发生这种情况。
我的应用程序很大,所以我不希望它在打开键盘时重新启动并丢失所有状态。我该如何预防?
Answers:
2013年4月更新:请勿执行此操作。在2009年,当我第一次回答这个问题时,这不是一个好主意,现在确实不是一个好主意。出于以下原因,请参阅hackbod的答案:
避免在Android中更改方向时使用asynctask重新加载活动
添加android:configChanges="keyboardHidden|orientation"
到您的AndroidManifest.xml。这告诉系统您将要处理的配置更改-在这种情况下,什么也不做。
<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)开始,当设备在纵向和横向之间切换时,“屏幕尺寸”也会更改。因此,如果要防止在开发API级别13或更高级别时(如minSdkVersion和targetSdkVersion属性所声明的)因方向更改而导致运行时重新启动,则除“ orientation”值外,还必须包括“ screenSize”值。也就是说,您必须声明
android:configChanges="orientation|screenSize"
。但是,如果您的应用程序以API级别12或更低级别为目标,则您的活动始终会自行处理此配置更改(即使在Android 3.2或更高版本的设备上运行,此配置更改也不会重新启动您的活动)。
您需要作为修改的AndroidManifest.xml Intrications(以前阿什顿)提到,确保活动处理的onConfigurationChanged事件,只要你想它来处理。它应该是这样的:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
setRequestedOrientation()
在onCreate()
。
onConfigurationChanged()
在之前被调用,设置它所属的配置也更干净,因此此答案仍然有效。onCreate()
如前所述,将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"
在活动的OnCreate方法中,使用以下代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
现在,您的方向将设置为纵向,并且永远不会改变。
在您的androidmanifest.xml文件中:
<activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">
要么
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
要通过代码锁定屏幕,您必须使用屏幕的实际旋转角度(0、90、180、270),并且必须知道屏幕的自然位置,在智能手机中,自然位置为纵向,而在平板电脑中,这将是风景。
这是代码(锁定和解锁方法),它已经在某些设备(智能手机和平板电脑)上经过测试,并且效果很好。
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)]
作为类的属性,例如:
[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Activity
{...}
加
android:configChanges="keyboardHidden|orientation|screenSize"
到你的清单。
请注意,这些方法现在似乎都不起作用!
在Android Studio 1中,一种简单的方法是添加
android:screenOrientation="nosensor"
。
这样可以有效锁定屏幕方向。