繁体   English   中英

Android的onConfigurationChanged没有被调用

[英]Android onConfigurationChanged not being called

我在告诉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

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

这是我〜〜相同问题的鬼脸:

注意:从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 14+将“ | screenSize”添加到android:configChanges =“ orientation”

要尝试的几件事:

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"

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

android:configChanges="keyboardHidden|orientation"

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

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

android:configChanges="keyboardHidden|orientation|screenSize"

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

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

它不是在我的Fragment触发的( Fragments没有在AndroidManifest.xml注册),所以我必须将它移到管理FragmentActivity ,在我的例子中是TabsPagerActivity

表现:

<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 

很少可以交叉检查的内容:

就我而言,我正在使用onConfigurationChanged跟踪设备的语言更改。

关于onConfigurationChanged几乎不需要了解的事情,就是Activity和Application的onConfigurationChanged之间的行为有所不同。

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

而另一件事是,清单中的仅语言环境有时无法正常工作,因此您已经声明了其他配置更改事件以及该语言环境(在我的情况下),应该类似于android:configChanges =“ layoutDirection | locale”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM