【问题标题】:Android onConfigurationChanged not being calledAndroid onConfigurationChanged 未被调用
【发布时间】:2011-09-21 09:47:49
【问题描述】:

我无法告诉 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

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

【问题讨论】:

    标签: java android configuration orientation


    【解决方案1】:

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

    在我的例子中,我使用 onConfigurationChanged 跟踪设备的语言变化。

    关于 onConfigurationChanged 需要了解的一点是 Activity 和 Application 的 onConfigurationChanged 在行为上存在一些差异。

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

    另一件事是清单中的语言环境有时会不起作用所以你已经声明了其他配置更改事件以及应该像 android:configChanges="layoutDirection|locale" 的语言环境(在我的情况下)强>

    【讨论】:

      【解决方案2】:

      清单:

      <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
      

      【讨论】:

        【解决方案3】:

        它没有在我的Fragment 中触发(Fragments 没有在AndroidManifest.xml 中注册)所以我不得不将它移到Activity 来管理我的Fragment,在我的情况下是@987654326 @。

        【讨论】:

          【解决方案4】:

          这是我遇到的~同样的问题:

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

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

          TL;DR:为 API 14+ 添加“|screenSize”到 android:configChanges="orientation"

          【讨论】:

          • 太棒了...在将我的 targetSdkVersion 从 8 更改为 14 之后,我想知道为什么没有调用 onConfigurationChanged()。
          【解决方案5】:

          有几件事可以尝试:

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

          确保您没有在任何地方拨打setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);。这将导致 onConfigurationChange() 不会触发。

          检查您没有在清单中使用android:screenOrientation

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

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

          【讨论】:

          • 对我来说,诀窍是使用 android:configChanges="orientation|keyboardHidden|screenSize"
          【解决方案6】:

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

          android:configChanges="keyboardHidden|orientation|screenSize"
          

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

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

          【讨论】:

            【解决方案7】:

            试试这个.....

            android:configChanges="orientation|keyboardHidden|screenSize"
            

            【讨论】:

              【解决方案8】:

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

              android:configChanges="keyboardHidden|orientation"
              

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

              【讨论】:

              • 就我而言,它仅在我添加“|screenSize”时才有效。
              • 这个答案不再有效,由于 sdk 的变化
              猜你喜欢
              • 1970-01-01
              • 2013-05-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-07-26
              • 1970-01-01
              • 1970-01-01
              • 2014-08-26
              相关资源
              最近更新 更多