禁用OrientationEventListener时调用onOrientationChanged()

hea*_*des 5 lifecycle android orientation android-fragments android-activity

OrientationEventListener即使在我禁用报告事件后,我也遇到了问题.

我正在使用选项卡布局中的三个片段,并且只有一个片段需要更改方向.当我离开这个片段时,我希望方向事件停止产生效果.

我的代码的生命周期部分如下:

@Override
public void onActivityCreated(Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);

    if (orientationEventListener == null)
    {
        Log.w(LogTags.MOBILE_MONITOR, "Creating orientationListener in " + this.toString());
        orientationEventListener = new OrientationEventListener(getActivity(), SensorManager.SENSOR_DELAY_NORMAL) {
            @Override
            public void onOrientationChanged(int angle) {

                ...Do work using getActivity()...

            }
        };
    }

}

@Override
public void onResume() {
    super.onResume();
    orientationEventListener.enable();    
}

@Override
public void onPause() {
    super.onPause();
    orientationEventListener.disable();
}
Run Code Online (Sandbox Code Playgroud)

当我在移动设备时切换片段时出现问题.当我尝试调用getActivity()onOrientationChanged(int angle)OrientationEventListener,调用返回null,这意味着我得到一个空指针异常,如果我尝试使用它.

虽然我可以在这里添加一个空检查,但我只是想知道为什么当我明确禁用了监听器时我会收到一个定向事件.如果我OrientationEventListener在故障点进行检查,它甚至会报告mEnabled=false.有没有办法阻止事件传播给我的听众?

Pau*_*aul 0

如果将方向设置为ActivityInfo.SCREEN_ORIENTATION_SENSOR,则活动将由物理方向传感器自动旋转。https://developer.android.com/reference/android/R.attr.html#screenOrientation

通过重置活动的方向模式来解决此问题。例如,重置为默认的纵向布局:

mOrientationEventListener.disable();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Run Code Online (Sandbox Code Playgroud)