我如何禁用方向改变在Android?

我有一个应用程序,我只是想在纵向模式下使用,所以我已经定义 android:screenOrientation=“portrait”在manifest XML中。这适用于HTC魔法电话(并防止在其他电话上改变方向)

但我有一个问题与HTC G1电话,因为我打开硬件QWERTY键盘(不是虚拟键盘)。我的活动保持在肖像模式,但它似乎重新启动,失去了所有的状态。这在HTC的英雄版本中不会发生。

我的应用程序相当大,所以我不希望它在打开键盘时重新启动并失去所有状态。我该如何预防呢?

254628 次浏览

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属性声明),您 必须包含"screenSize"值除了"orientation" 价值。也就是说,你必须申报 android:configChanges="orientation|screenSize"。然而,如果你 应用程序目标API级别12或更低,那么你的活动总是 处理此配置更改本身(此配置更改 不会重新启动您的活动,即使在Android 3.2或 更高的设备)。< / p >

你需要修改AndroidManifest.xml Intrications(以前阿什顿)提到,并确保活动处理onConfigurationChanged事件,因为你想要它处理。它应该是这样的:

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

我一直觉得你两者都需要

android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"

在你的androidmanifest.xml文件中:

   <activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

如前所述,将Activity的android:configChanges(在manifest文件中)设置为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"(在manifest中)。使用这种方式,你根本不能处理方向的变化。

在你的活动的OnCreate方法中使用以下代码:

    @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

现在你的方向将被设置为竖屏,永远不会改变。

使用这个. .

    android:screenOrientation="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);
}

添加

android:configChanges="keyboardHidden|orientation|screenSize"

到您的舱单上。

在AndroidManifest.xml文件中,为你想锁定的每个活动添加最后的screenOrientation行:

android:label="@string/app_name"
android:name=".Login"
android:screenOrientation="portrait" >

android: screenOrientation = "风景"

请注意,现在这些方法似乎都不起作用!

Android工作室 1中,一个简单的方法是添加 android:screenOrientation="nosensor" . < / p >

这有效地锁定了屏幕方向。

在Visual Studio Xamarin中:

  1. 添加:

using Android.Content.PM;到你的活动命名空间列表。

  1. 添加:

[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]

作为你类的属性,像这样:

[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Activity
{...}

如果你想在你的应用程序中的所有活动都只使用纵向模式,你可以简单地在应用程序类中使用如下所示。

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) {


}


})


}