我在Android设备上遇到了一个奇怪的问题(或者可能是意外行为)。
问题是我正在像这样监听DialogFragment中的配置更改:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Do something secret here :)
}
我在活动中添加了android:configChanges
,该活动负责显示对话框片段
<activity
android:name=".SecretActivity"
android:configChanges="orientation|screenSize"
android:windowSoftInputMode="adjustResize" />
实际上,当我旋转设备时,我正在从系统获取回调,但并非在所有情况下都如此。正如您在图片onConfigurationChanged( )
中看到的那样,仅当我旋转90度时旋转,也旋转360度,在其他情况下不调用。
这是预期的行为吗? 如果是,我如何检测所有旋转(90、180、270、360)?
答案 0 :(得分:6)
如果您进行的活动未指定屏幕方向,则设备通常会忽略180°旋转,而仅支持一个横向方向。
要支持所有方向,请向您的活动清单条目添加显式screenOrientation
属性:user
或sensor
,具体取决于您是否要支持用户锁定设备方向。
答案 1 :(得分:2)
当设备不旋转/移动时,OrientationEventlistener将不起作用。
我发现显示侦听器是检测更改的更好方法。
DisplayManager.DisplayListener mDisplayListener = new DisplayManager.DisplayListener() {
@Override
public void onDisplayAdded(int displayId) {
android.util.Log.i(TAG, "Display #" + displayId + " added.");
}
@Override
public void onDisplayChanged(int displayId) {
android.util.Log.i(TAG, "Display #" + displayId + " changed.");
}
@Override
public void onDisplayRemoved(int displayId) {
android.util.Log.i(TAG, "Display #" + displayId + " removed.");
}
};
DisplayManager displayManager = (DisplayManager) mContext.getSystemService(Context.DISPLAY_SERVICE);
displayManager.registerDisplayListener(mDisplayListener, UIThreadHandler);
onDisplayChanged仅在getRotation()更改时完全触发。另一方面,甚至在getRotation()更改之前,OrientationEventListener都会实时不断地触发,从而导致从角度进行180°旋转时屏幕旋转值完全错误。
答案 2 :(得分:1)
嗯,检查清单,添加/修改
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
答案 3 :(得分:1)
更改此
<activity
android:name=".SecretActivity"
android:configChanges="orientation|screenSize"
android:windowSoftInputMode="adjustResize" />
对此
<activity android:name=".SecretActivity" android:configChanges="screenSize|orientation|screenLayout|navigation"/>
请检查this answer是我的第二个答案。