Java 未调用Android OnConfiguration已更改

Java 未调用Android OnConfiguration已更改,java,android,configuration,orientation,Java,Android,Configuration,Orientation,我很难告诉Android在方向改变时不要调用onCreate()。我已经将android:configChanges=“orientation”添加到我的清单中,但仍然是在调用方向更改时。这是我的密码 AndroidManifest.xml <activity android:name="SearchMenuActivity" android:theme="@android:style/Theme.NoTitleBar" android:configChanges="orientation

我很难告诉Android在方向改变时不要调用
onCreate()
。我已经将
android:configChanges=“orientation”
添加到我的清单中,但仍然是在调用方向更改时。这是我的密码

AndroidManifest.xml

<activity android:name="SearchMenuActivity" android:theme="@android:style/Theme.NoTitleBar" android:configChanges="orientation"></activity>
还有我的LogCat输出

06-23 12:33:20.327: DEBUG/APP(2905): onCreate() Called
//Orientation Changes
06-23 12:33:23.842: DEBUG/APP(2905): onCreate() Called

有人知道我做错了什么吗?谢谢。

有几件事可以试试:

android:configChanges=“orientation | keyboardHidden | screenSize”
而不是
android:configChanges=“orientation”

确保您没有调用
setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u Grait)任何地方。这将导致OnConfiguration Change()不触发

检查清单中是否未使用android:screenOrientation

如果这些都不起作用,请通读Android文档中关于处理运行时更改的内容,并确保您所做的一切都是正确的。可能是代码中的其他地方导致了问题


编辑:正如德里克指出的,我假设您正在更改配置,加速计检测设备的方向。如果您希望在显示/隐藏键盘时更改配置,则清单中的configChanges还必须包括
keyboardHidden

您应该将AndroidManifest.xml中的configChanges条目更改为:

android:configChanges="keyboardHidden|orientation"

否则,即使方向改变,滑动键盘也不会触发OnConfiguration Change()。我刚刚在我的HTC Desire Z上测试了这一点。

这是我的小精灵,用于~相同的问题:

注意:从Android 3.2(API级别13)开始,“屏幕大小” 当设备在纵向和横向之间切换时也会发生变化 方向。因此,如果您想防止由于以下原因而重新启动运行时: API 13级或更高级别(如适用)开发时的方向变化 由minSdkVersion和targetSdkVersion属性声明),您可以 除“方向”外,还必须包括“屏幕大小”值 价值也就是说,你一定是 android:configChanges=“方向|屏幕大小”。但是,如果您的 应用程序以API级别12或更低为目标,那么您的活动始终 处理此配置更改本身(此配置更改 即使在Android 3.2或更高版本上运行,也不会重新启动活动 更高的设备)

(来自)

TL;DR:为API 14+的android:configChanges=“orientation”添加“屏幕大小”

尝试使用这个

android:configChanges="orientation|keyboardHidden|screenSize"

将此添加到每个活动的清单中

android:configChanges="keyboardHidden|orientation|screenSize"
然后,在活动上覆盖
onConfigurationChanged

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

它没有在我的
片段中触发(
片段
未在
AndroidManifest.xml
中注册),因此我必须将其移动到
活动中,管理我的
片段,在我的情况下,
选项卡活动

清单:

<activity
      android:name=".MainActivity"
      android:configChanges="orientation|keyboardHidden|screenSize">
</activity>
输出:


很少有事情可以交叉检查:

在我的例子中,我使用OnConfiguration Changed跟踪设备的语言更改

关于onConfigurationChanged,您不需要知道的是,活动的onConfigurationChanged和应用程序的onConfigurationChanged在行为上存在一些差异

当您更改设备配置时,将自动立即调用应用程序级OnConfiguration Changed,但当您导航到该活动时,将调用OnConfiguration Changed of activity。


另一件事是,清单中只有区域设置有时不起作用,因此您必须声明其他配置更改事件以及区域设置(在我的例子中),这应该类似于android:configChanges=“layoutDirection | locale”

太棒了…在将我的targetSdkVersion从8更改为14之后,我想知道为什么onConfigurationChanged()没有被调用。在我的例子中,它只在我添加“屏幕大小”时起作用。由于SDK中的更改,这个答案不再有效。对于我来说,诀窍是使用android:configChanges=“orientation | keyboardHidden | screenSize”
<activity
      android:name=".MainActivity"
      android:configChanges="orientation|keyboardHidden|screenSize">
</activity>
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    Log.d(TAG, "onConfigurationChanged  " +
               (newConfig.orientation
                == Configuration.ORIENTATION_LANDSCAPE
                ? "landscape" : "portrait"));
}
10-29 21:53:26.951 D/FragmentOne: onConfigurationChanged landscape

10-29 21:53:26.951 D/MainActivity:onConfigurationChanged landscape