即使禁用了OrientationEventListener
报告事件,我也遇到了问题。
我正在使用选项卡布局中的三个 fragment ,只有其中一个 fragment 需要更改方向。当我离开这个 fragment 时,我希望定向事件不再起作用。
我的代码的生命周期部分如下:
@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();
}
当我在移动设备时切换 fragment 时,问题就来了。当我尝试在
getActivity()
的 onOrientationChanged(int angle)
中调用 OrientationEventListener
时,该调用返回 null,这意味着如果我尝试使用它,我会得到一个空指针异常。尽管我可以在此处添加一个空检查,但我只想知道当我明显禁用了监听器时为什么会收到定向事件。如果我在故障点检查
OrientationEventListener
,它甚至会报告mEnabled=false
。有什么方法可以防止事件传播到我的监听器? 最佳答案
如果您将方向设置为 ActivityInfo.SCREEN_ORIENTATION_SENSOR
,则 Activity 将被物理方向传感器自动旋转。 https://developer.android.com/reference/android/R.attr.html#screenOrientation
通过重置 Activity 的方向模式来解决这个问题。例如,重置为默认的纵向布局:
mOrientationEventListener.disable();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);