onConfigurationChanged没有被调用


141

今天早上,我想到了一个尝试处理该onConfigurationChanged事件的问题。问题在于,当我更改手机的方向时,无法调用我重写的方法。根本没有接到电话。

我已经android:configChanges="orientation"按照Android文档中的说明放置了清单中定义的活动,但这并没有什么不同。

你有这个问题吗?


1
我在android:configChanges =“ keyboardHidden”中遇到相同的问题-当软键盘滑入或滑出时,不会调用onConfigurationChanged。
Pieter Witvoet

keyboardHidden不是由软件键盘触发的,而是由硬件键盘触发的,例如Droid上的滑动键盘。
nmr 2012年

10
您应该在其中添加“ screenSize”,android:configChanges 这是Google Javadoc所说的: Note: If your application targets API level 13 or higher (as declared by the minSdkVersion and targetSdkVersion attributes), then you should also declare the "screenSize" configuration, because it also changes when a device switches between portrait and landscape orientations.
Ektos974 2014年

@ Ektos974太好了!添加screenSize会调用onConfigurationChanged!
Manuela

嗨,我正在使用Theme.Holo.Light.NoActionBar主题。为此,我的活动正在重新开始。有什么方法可以避免活动重新开始吗?
Manukumar

Answers:


250

这是我〜〜相同问题的怪胎:

注意:从Android 3.2(API级别13)开始,当设备在纵向和横向之间切换时,“屏幕尺寸”也会更改。因此,如果要防止在为API级别13或更高级别开发时(由于minSdkVersion和targetSdkVersion属性所声明的)方向改变而导致运行时重启,则除了“ orientation”值外,还必须包括“ screenSize”值。也就是说,您必须贴花android:configChanges =“ orientation | screenSize”。但是,如果您的应用程序以API级别12或更低级别为目标,则您的活动始终会自行处理此配置更改(即使在Android 3.2或更高版本的设备上运行,此配置更改也不会重新启动您的活动)。

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

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


9
哇,+1我要添加的只是一个属性,该死的全部"screenSize"
Anuj 2012年

@philipp将传感器的方向设置会怎样?不确定如何使用会有所帮助。谢谢你的编辑。
nmr 2012年

4年后的今天,人们仍然被这个人咬伤:)
Daniel Wilson

谢谢。花了30分钟将我的头撞在墙上。
lagos'2

这是完美的解决方案
Anbarasu Chinna

40

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

android:configChanges="orientation|screenSize"

这解决了我的问题。对于Nexus 7平板电脑,仅覆盖清单中的onConfigurationChanged,进行测试Configuration.ORIENTATION_LANDSCAPE并仅android:configChanges="orientation"在清单中进行测试是不够的。谢谢
Jantzilla '18

37

问题是,如果您使用此方法

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

强制将您的方向Activity设为纵向模式,则您不打算接受orientation更改。

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


5
是的,那行得通,但是如果我不想旋转我的应用程序怎么办?我希望它保持横向模式。
stoefln 2011年

您必须在清单文件中指定<activity android:name =“。MyActivity” android:screenOrientation =“ landscape”> </ activity>
Qadir Hussain

3
我既要使用该功能(当用户在视频播放器上单击“全屏”时),又要onConfigChanged在用户旋转手机时也保持接收状态。与youtube应用中的行为相同。这可能吗?
Vucko

29

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

“屏幕旋转”设置


7
我遇到了一个有趣的问题……:D
Dharmendra

即使“屏幕旋转”选项为“关闭”,也可以旋转活动吗?如果是,请告诉我该怎么做……。据我所知,这是行不通的,但是某些应用程序会将活动转为横向。
Srinivasan 2015年

1
S ** t !!! 花了4-5个小时尝试使我的代码正常工作!可以从我的另一个答案中学到的一种方法是在清单中包含<android:orientation =“ sensor”>
suku 2016年

19
  1. 检查您是否未android:screenOrientationActivityApplication级别中使用。
  2. 尝试android:configChanges="orientation|keyboardHidden"改用。

1
我如何使用android:screenOrientation并希望onConfigurationChanged方法运行,我该怎么办,thx
Bingchean 2015年

17

我花了数十分钟来找出为什么它不起作用。我添加了,screenSize但仍然没有用。

原来,我已经添加android:configChanges<application>元素,而不是<activity>应该添加的元素!

好吧,这当然是我的错误,但是我们都知道我们所有人都花很多时间来解决这种愚蠢的错误。因此,我添加了这个答案,以防万一应该有另一个像我这样的傻程序员。


我也在做同样的事情,谢谢您救了我
Pranoy Sarkar

谢谢老兄!
劳伦(Laurent)

14

Macarse在第二选项中获得100%的收益。

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

我遇到了完全相同的问题,在1.6仿真器上添加了keyboardHidden导致onConfigurationChanged旋转期间调用的原因。删除它,它停止被调用。


5

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

方向在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"/>

9
您遇到的问题是缺少属性:屏幕尺寸。请更新您的答案。对于初学者和开发者来说,这将是一个误导性的“解决方案”
Tobrun

@ user1281750谢谢,但是作为我自己的Android开发者,我不确定你是在说什么。
aLearner 2013年

@aLearner我认为user1281750意味着什么:这实际上不是解决方法!如果您需要更高版本的SDK,该怎么办?
AgentKnopf

我分享了对我有用的东西。我意识到这可能不是解决办法。但是有什么选择呢?什么是“正确”的解决方案?“失踪attribute: screensize” 是什么意思?如果提供更多详细信息,可能会有所帮助。
aLearner

谢谢哥们,这个解决方案解决了我的紧张情绪。.我冲浪了一个小时才得到它……它也可以在所有更新版本中使用
Sampath Kumar

3

我刚刚发现,如果您有:

android:screenOrientation="landscape"

在清单中,onConfigurationChanged()也不会被调用...

这可能类似于:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

该设置方向会阻止onConfigurationChanged()。


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

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

android:configChanges="orientation|keyboardHidden|screenLayout"

3

不确定这是否是最佳选择,但是在遇到此问题时-我发现了一些有趣的事情。

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

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


这就是我所看到的-但我不想成为。并且根据文档,它不应该以这种方式发生。太混乱了
slycrel 2014年

2

在尝试删除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>

有什么办法可以避免在不删除windowNoTitle的情况下重新启动活动?
Manukumar

2

没有任何建议对我有用(我对本地项目对此问题做出了反应),但是经过数小时的调试后,我发现如果在Styles.xml的AppTheme中有此行

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

应用程式将不会旋转。


1

@ thanhbinh84让我知道是什么原因造成的。 从styles.xml主题中
删除 <item name="android:windowIsTranslucent">true</item>它可以解决问题!


0

我遇到了同样的问题,清单中同时指定了“ android:screenOrientation”和“ android:configChanges”。当我删除第一个时,onConfigurationChanged()在旋转时被调用。奇怪,但它可以起锅)


1
但是,然后如何旋转?
Mark Molina 2014年

-2

您有android.content.res.Configuration进口声明吗?如果按,Eclipse可以自动插入导入Ctrl+Shift+O

如果缺失,编译器将无法识别您合法地覆盖了超类方法,因此将引发错误。


是的,导入已经到位,有什么想法吗?因为我没有收到任何错误或任何东西,只是没有接到电话。
lblasa 2011年

我不知道这是否与所有应用程序都以纵向模式制作的事实有关。我需要处理onConfigurationChangedEvent的活动是TabHost中包含的活动,该活动为纵向模式。但是无论如何,我还没有发现任何有关捕获该事件的评论。我真的没有主意。
lblasa 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.