onConfigurationChanged不会避免在方向更改时重新启动活动

时间:2014-03-11 18:59:06

标签: java android android-layout rotation android-activity

对于相机应用,我希望避免在方向更改时重新绘制活动。 到目前为止,我一直在使用android:screenOrientation="landscape"

现在我希望图标根据方向变化进行旋转。

嗯,它应该非常简单: 首先删除上面的代码行。 然后在活动清单中设置:

android:configChanges="orientation|screenSize|keyboardHidden"

最后,您在活动中覆盖onConfigurationChanged:

    @Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        //Do something
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        //Do something
    }
}

现在,AFAIK,它应该触发onConfigurationChanged 而不是重新启动活动(假设它将在onConfigurationChanged中处理)

实际上,当方向改变时,除了不需要的旋转之外,还会触发onConfigurationChanged,。如何取消?我错过了什么?

设备:小米Mi2s API:4.1.1

谢谢, 标记

3 个答案:

答案 0 :(得分:1)

您需要阻止父级处理配置,如下所示:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(null);
    //TODO: Do nothing when orientation has changed...
}

正如您所看到的,您需要做的就是将null传递给onConfigurationChanged的超级方法,因此它实际上会阻止您完成所有想要避免的更改。

问候!

答案 1 :(得分:0)

试试这个:

@Override
public void onConfigurationChanged(Configuration newConfig) {

  if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
    //Do something
  } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
    //Do something
  }
  super.onConfigurationChanged(newConfig);
}

如果您不想重新创建活动,请使用方向传感器检测方向。

答案 2 :(得分:0)

好吧,在传统方法失败后 - 我决定自己实施方向改变例程。

为此,首先,我已将android:screenOrientation="landscape"退回清单。

然后,我用一些数学实现了传感器监听器回调:

private SensorEventListener listener = new SensorEventListener() {
    public void onSensorChanged(SensorEvent e) {
        if (e.sensor.getType()==Sensor.TYPE_ACCELEROMETER) {
            float x = e.values[0];
            float y = e.values[1];

            //update _angle in rotate()

            if (Math.abs(y) / Math.abs(x) < 1.0)
            {
                if (x<0 && _angle != 270f)
                    rotate(270f);
                else if(x>=0 && _angle != 90f)
                    rotate(90f);
            }
            else
            {
                if (y<0 && _angle != 180f)
                    rotate(180f);
                else if (y>=0 && _angle != 0f)
                    rotate(0f);
            }
        }

    }
            @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub

        }
    };

像魅力一样。

相关问题