我有一个我想在纵向模式下使用的应用程序,所以我在清单XML中定义了android:screenOrientation = "portrait" . 这适用于HTC Magic手机(并防止其他手机上的方向更改) .
但是当我打开硬件QWERTY keyboard(而不是虚拟键盘)时,HTC G1手机出现问题 . 我的活动保持纵向模式,但它似乎重新启动并失去所有状态 . HTC Hero版本不会发生这种情况 .
我的应用程序非常大,所以我不希望它在键盘打开时重新启动并丢失所有状态 . 我怎么能防止这种情况?
12 回答
Update April 2013: Don't do this. It wasn't a good idea in 2009 when I first answered the question and it really isn't a good idea now. See this answer by hackbod for reasons:
Avoid reloading activity with asynctask on orientation change in android
将
android:configChanges="keyboardHidden|orientation"
添加到AndroidManifest.xml . 这告诉系统您将自己处理哪些配置更改 - 在这种情况下无需执行任何操作 .有关更多详细信息,请参阅开发人员参考configChanges .
但是,您的申请可以随时中断,例如通过电话,所以你真的应该添加代码来保存应用程序暂停时的状态 .
Update: 从Android 3.2开始,您还需要添加"screenSize":
来自开发者指南Handling the Configuration Change Yourself
你需要修改AndroidManifest.xml为Intrications(之前的Ashton),并确保活动处理你想要它处理的onConfigurationChanged事件 . 它应该是这样的:
我总是发现你需要两者
如上所述,将您的活动的
android:configChanges
(在清单文件中)设置为keyboardHidden|orientation
,然后:1)覆盖
onConfigurationChanged()
2)将此行添加到您的活动的
onCreate()
这比将相同的行添加到
onConfigurationChanged
更好,因为你的应用程序将转为纵向模式,然后回到横向(它只会发生一次,但它很烦人) .您也可以为活动设置
android:screenOrientation="nosensor"
(在清单中) . But 使用这种方式你根本无法处理方向变化 .用这个..
在您的活动的OnCreate方法中使用以下代码:
现在,您的方向将设置为纵向,永远不会改变 .
在AndroidManifest.xml文件中,对于要锁定的每个活动,添加最后一个
screenOrientation
行:或 android:screenOrientation="landscape" .
在 androidmanifest.xml 文件中:
要么
要通过代码锁定屏幕,您必须使用屏幕的实际旋转(0,90,180,270),您必须知道它的自然位置,在智能手机中,自然位置将是纵向和平板电脑,这将是风景 .
这是代码(锁定和解锁方法),它已经在一些设备(智能手机和平板电脑)中进行了测试,效果很好 .
在Visual Studio Xamarin中:
using Android.Content.PM;
到您的活动命名空间列表 .[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]
作为你的类的属性,像这样:
加
到你的清单 .
请注意,现在没有一种方法可行!
在Android Studio 1中,一种简单的方法是添加
android:screenOrientation="nosensor"
.这有效地锁定了屏幕方向 .