在180和270度未调用onConfigurationChanged

时间:2019-01-16 14:35:39

标签: java android kotlin screen-orientation

我在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)?

enter image description here

4 个答案:

答案 0 :(得分:6)

如果您进行的活动未指定屏幕方向,则设备通常会忽略180°旋转,而仅支持一个横向方向。

要支持所有方向,请向您的活动清单条目添加显式screenOrientation属性:usersensor,具体取决于您是否要支持用户锁定设备方向。

答案 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是我的第二个答案。