[英]Android onConfigurationChanged() is not being called in Activity
[英]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
注册),所以我必须将它移到管理Fragment
的Activity
,在我的例子中是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.