onConfigurationChanged没有被调用

时间:2011-04-11 10:32:27

标签: android

今天早上我想出了一个试图处理onConfigurationChanged事件的问题。问题是当我改变手机的方向时,我覆盖的方法没有被调用。根本没有被召唤。

我已将android:configChanges="orientation"放在清单中定义的活动上,如android文档中所述,但这没有什么区别。

你有没有想出这个问题?

16 个答案:

答案 0 :(得分:241)

对于同样的问题,这是我的问题:

  

警告:从Android 3.2(API级别13)开始,“屏幕大小”   当设备在纵向和横向之间切换时也会发生变化   取向。因此,如果您希望阻止运行时重新启动   开发API级别13或更高级别时的方向更改(如   由minSdkVersion和targetSdkVersion属性声明),你   除“方向”外,还必须包含“screenSize”值   值。也就是说,你必须decalare   机器人:configChanges = “方向|屏幕尺寸”。但是,如果你的   应用程序目标API级别12或更低,然后您的活动始终   处理此配置更改本身(此配置更改   即使在Android 3.2或Android上运行,也不会重新启动您的活动   更高的设备)。

(来自http://developer.android.com/guide/topics/resources/runtime-changes.html

TL; DR:在定位API级别13时,将“| screenSize”添加到configChanges

答案 1 :(得分:35)

问题是如果你使用这种方法

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

要强制Activity到纵向模式的方向,您不能接受orientation次更改。

因此,解决方案是不setRequestOrientation到特定模式。但请改用SCREEN_ORIENTATION_SENSOR.

答案 2 :(得分:34)

4.0的某些设备不会调用onConfigurationChanged。只需向screenSize添加一个监听器。

android:configChanges="orientation|screenSize"

答案 3 :(得分:26)

检查您的设备是否已将“屏幕旋转”设置为

"Screen rotation" setting

答案 4 :(得分:18)

  1. 检查您是否在android:screenOrientationActivity级别中使用Application
  2. 请尝试使用android:configChanges="orientation|keyboardHidden"

答案 5 :(得分:17)

我花了几十分钟才发现它为什么不起作用。我添加了c,但它仍然无效。

原来,我已将screenSize添加到android:configChanges元素,而不是<application>元素,因为我应该拥有!

当然,这是我的错误,但我们都知道我们所有人都花了很多时间来处理这种愚蠢的错误。所以,我正在添加这个答案,以防万一像我这样的傻程序员。

答案 6 :(得分:14)

Macarse凭借他的第二选择获得100%的奖金。

尝试android:configChanges="orientation|keyboardHidden|screenSize"

我有完全相同的问题,并且在1.6模拟器上添加keyboardHidden导致在轮换期间调用onConfigurationChanged。删除它,它停止被调用。

答案 7 :(得分:5)

我遇到了同样的问题 - 尽管在清单文件中有onConfigurationChanged,但设备更改了方向时未调用android:configChanges="orientation|keyboardHidden"。我使用了Deva在此处共享的剪切代码

orientation is not working in 2.3.3?

检查是否正在调用onConfigurationChanged。事实并非如此。

经过几个小时的实验,我意识到我在清单文件中有以下几行

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15"/>

在将android:targetSdkVersion="15"更改为android:targetSdkVersion="8"时,onConfigurationChanged开始被调用。因此,清单的一部分最终看起来像这样

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="8"/>

答案 8 :(得分:3)

我刚发现如果你有:

android:screenOrientation="landscape"
清单中的

,onConfigurationChanged()也不会被调用...

这可能类似于:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

设置方向会阻止onConfigurationChanged()。

答案 9 :(得分:3)

<uses-sdk android:minSdkVersion="8" android:maxSdkVersion="17" />

不要使用任何目标sdk版本来使您复杂化。并且对于所有api级别,将其用作配置更改侦听器

android:configChanges="orientation|keyboardHidden|screenLayout"

答案 10 :(得分:3)

不确定这是最适合它的地方,但在遇到这个问题时 - 我发现了一些有趣的事情。

如果 onConfigurationChanged() 侦听器不起作用,则每次更改方向时都会再次调用onCreate()。

如果 onConfigurationChanged() 侦听器正在运行,则在方向更改时调用该方法而不是onCreate()。

答案 11 :(得分:1)

所有解决方案都不起作用我尝试删除Android清单文件中的主题活动。很奇怪

<activity
        android:name="MyActivity"
        android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
        android:theme="@style/MyTheme" --> remove this line
        />



<style name="MyTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="windowNoTitle">true</item>
    <item name="android:windowIsTranslucent">true</item>
</style>

答案 12 :(得分:1)

@ thanhbinh84让我知道可能导致这种情况的原因。
删除 <item name="android:windowIsTranslucent">true</item> 从我在styles.xml中的主题修复它!

答案 13 :(得分:1)

这些建议都没有对我有用(我已经对本期项目做了反应),但是经过几个小时的调试后我发现如果你在styles.xml的AppTheme中有这一行

<item name="android:windowIsTranslucent">true</item>

然后应用程序将不会旋转。

答案 14 :(得分:0)

我有同样的问题,我在清单中指定了“android:screenOrientation”和“android:configChanges”。当我删除第一个时,onConfigurationChanged()会在旋转时调用。很奇怪,但它开始了)

答案 15 :(得分:-2)

您的导入声明中是否有android.content.res.Configuration?如果按Ctrl+Shift+O,Eclipse可以自动插入导入。

如果缺少,编译器将无法识别您是否合法地覆盖了超类方法,因此会抛出错误。