倒置旋转不触发配置更改。

7
当我把我的安卓手机倒转过来时,我的Activity没有翻转来显示倒置的布局,而是仍然保持横屏模式。我在一个非常简单的HelloWorld应用程序中尝试了这个功能。我在清单中添加了"android:configChanges="orientation"",并在Activity中覆盖了"onConfigurationChange()"来设置断点。将设备倒转产生一次配置更改,从竖屏(倒向上)到横屏,但没有第二次从横屏到竖屏(倒置)的更改。这是一个安卓问题还是我需要做些什么?
清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="hello.world"
    android:versionCode="1"
    android:versionName="1.0" >
   <uses-sdk android:minSdkVersion="10" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:configChanges="orientation"
            android:name=".HelloWorldActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

活动:

public class HelloWorldActivity
  extends Activity
{
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
  }

  public void onConfigurationChanged(Configuration newConfig)
  {
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
      Log.e("MDO", "orientation change: landscape");
    }
    else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
      Log.e("MDO", "orientation change: portrait");
    }
  }
}

1
你确定你的设备可以做到这个吗?我很少见到有应用程序可以允许这样做。 - DeeV
我在我测试的一些标准应用程序中(例如设置、浏览器等)并没有看到这种行为,但是使用 android:screenOrientation="fullSensor" 可能会出现这种情况。 - Mirza Dobric
3个回答

11

这不是问题,而是Android的工作原理。它只在横屏模式下上下颠倒,而不是在竖屏模式下(如果我没记错,在2.2版本之后的横屏模式中会发生配置更改)。当手机从竖屏模式切换到横屏模式或者相反时,配置更改就会发生。如果你想检查手机是否被上下翻转或以其他方向旋转,你需要访问加速度传感器。这里有一个教程,介绍如何使用它,还可以参考SensorManager文档

编辑:正如问题的作者自己发现的那样,在您的清单中添加 android:screenOrientation="fullSensor" 就足够了,前提是您不希望支持比Android 2.3 (API级别9) 更老的版本


你有Android文档的链接来描述这个吗? - Mirza Dobric
2
实际上,如果我添加android:screenOrientation="fullSensor",我就能得到所需的行为。 - Mirza Dobric
问题是,它不能在Android 2.3(API级别9)以下的旧版本上运行。或者我错了吗?你测试过它吗? - Michał Klimczak
我的应用程序最低需要2.3版本,所以这个限制不是问题。 - Mirza Dobric
太好了。我很高兴你找到了解决方案 :) - Michał Klimczak
这对我有效,但基于活动清单元素的文档(https://developer.android.com/guide/topics/manifest/activity-element#screen)来看,“fullUser”似乎是更好的选择,因为它尊重用户的方向锁定设置。 - arlomedia

4

设置android:screenOrientation="fullSensor"可以实现我想要的功能。


3
在您的清单文件中,将screenSize包含在您的configChanges中。
android:configChanges="orientation|screenSize"

http://developer.android.com/guide/topics/resources/runtime-changes.html中得知:
从Android 3.2(API级别13)开始,当设备在纵向和横向方向之间切换时,“屏幕尺寸”也会发生变化。因此,如果您希望在开发针对API级别13或更高版本的应用程序时防止由于方向改变而导致运行时重启(通过minSdkVersion和targetSdkVersion属性声明),您必须除了“方向”值外还包括“屏幕尺寸”值。也就是说,您必须声明android:configChanges="orientation|screenSize"。然而,如果您的应用程序目标为API级别12或更低,则您的活动始终自己处理此配置更改(即使在Android 3.2或更高版本的设备上运行,此配置更改也不会重新启动您的活动)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接