我有一个我只想在纵向模式下使用的应用程序,所以我在清单 XML 中定义了 android:screenOrientation="portrait"。这适用于HTC Magic手机(也可以防止其他手机上的方向更改)。
但是当我打开硬件QWERTY 键盘(不是虚拟键盘)时,我遇到了HTC G1手机的问题。我的活动保持纵向模式,但它似乎重新启动并失去了所有状态。HTC Hero版本不会发生这种情况。
我的应用程序很大,所以我不希望它在打开键盘时重新启动并丢失所有状态。我怎样才能防止这种情况?
我有一个我只想在纵向模式下使用的应用程序,所以我在清单 XML 中定义了 android:screenOrientation="portrait"。这适用于HTC Magic手机(也可以防止其他手机上的方向更改)。
但是当我打开硬件QWERTY 键盘(不是虚拟键盘)时,我遇到了HTC G1手机的问题。我的活动保持纵向模式,但它似乎重新启动并失去了所有状态。HTC Hero版本不会发生这种情况。
我的应用程序很大,所以我不希望它在打开键盘时重新启动并丢失所有状态。我怎样才能防止这种情况?
2013 年 4 月更新:不要这样做。2009 年我第一次回答这个问题时,这不是一个好主意,现在真的不是一个好主意。出于以下原因,请参阅 hackbod 的答案:
添加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 或更低级别为目标,那么您的 Activity 始终会自行处理此配置更改(此配置更改不会重新启动您的 Activity,即使在 Android 3.2 或更高版本的设备上运行时也是如此)。
您需要将 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"
如前所述,将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"
为您的活动设置(在清单中)。但是使用这种方式,您根本无法处理方向变化。
Use this..
android:screenOrientation="portrait"
在您的活动的 OnCreate 方法中,使用以下代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
现在您的方向将设置为纵向并且永远不会改变。
在 AndroidManifest.xml 文件中,为每个要锁定的活动添加最后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);
}
要通过代码锁定屏幕,您必须使用屏幕的实际旋转(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"
.
这有效地锁定了屏幕方向。
如果您只希望应用程序中的所有活动都使用 PORTRAIT 模式,则可以在应用程序类中简单地使用如下所示。
class YourApplicationName : Application() {
override fun onCreate() {
super.onCreate()
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}
override fun onActivityStarted(activity: Activity) {
}
override fun onActivityResumed(activity: Activity) {
}
override fun onActivityPaused(activity: Activity) {
}
override fun onActivityStopped(activity: Activity) {
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
}
override fun onActivityDestroyed(activity: Activity) {
}
})
}
}