没有调用Android onConfigurationChanged

时间:2011-06-23 16:43:54

标签: java android configuration orientation

我无法告诉Android在方向更改时不调用onCreate()。我已将android:configChanges="orientation"添加到我的清单中,但仍然会调用方向更改onCreate()。这是我的代码。

的AndroidManifest.xml

<activity android:name="SearchMenuActivity" android:theme="@android:style/Theme.NoTitleBar" android:configChanges="orientation"></activity>

SearchMenuActivity.java

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Set the current layout to the search_menu
    setContentView(R.layout.search_menu_activity);

    Log.d(TAG, "onCreate() Called");
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
    //don't reload the current page when the orientation is changed
    Log.d(TAG, "onConfigurationChanged() Called");
    super.onConfigurationChanged(newConfig);
}

我的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

有谁知道我做错了什么?感谢。

8 个答案:

答案 0 :(得分:79)

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

  

警告:从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 14添加“| screenSize”到android:configChanges =“orientation”

答案 1 :(得分:56)

要尝试的几件事情:

android:configChanges="orientation|keyboardHidden|screenSize"而不是android:configChanges="orientation"

确保您没有在任何地方致电setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);。这将导致onConfigurationChange()无法触发。

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

如果这些都不起作用,请阅读Android doc处理运行时更改并确保正确执行所有操作。您的代码中可能存在导致问题的其他地方。 http://developer.android.com/guide/topics/resources/runtime-changes.html

编辑:正如derrik指出的那样,我假设你正在改变配置,加速度计检测设备面向的方式。如果您希望在显示/隐藏键盘时更改配置,则清单中的configChanges也必须包含keyboardHidden

答案 2 :(得分:10)

尝试使用这个......

android:configChanges="orientation|keyboardHidden|screenSize"

答案 3 :(得分:5)

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

android:configChanges="keyboardHidden|orientation"

否则,即使方向发生变化,滑动键盘也不会触发onConfigurationChange()。我刚在HTC Desire Z上测试了这个。

答案 4 :(得分:4)

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

android:configChanges="keyboardHidden|orientation|screenSize"

然后,在您的活动上覆盖onConfigurationChanged

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

答案 5 :(得分:1)

我的Fragment没有触发(Fragments未在AndroidManifest.xml注册)因此我不得不将其移至Activity管理我的Fragment TabsPagerActivity 1}},在我的情况下是{{1}}。

答案 6 :(得分:1)

清单:

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

活动&amp;片段:

@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

答案 7 :(得分:0)

很少有东西可以交叉检查:

在我的情况下,我使用onConfigurationChanged跟踪设备的语言更改。

关于onConfigurationChanged的一些事情需要知道的是,Activity和Application的onConfigurationChanged之间的行为有一些区别。

当您更改设备配置时,将自动立即调用应用程序级别onConfigurationChanged,但当您导航到该活动时,活动的onConfigurationChanged将会调用。

另一件事是只有locale中的语言环境不会在某个时候工作所以你已经声明了其他配置更改事件以及语言环境(在我的情况下)应该像 android:configChanges =“layoutDirection | locale”