onconfigurationchanged无法避免在方向更改时重新启动活动

fcwjkofz  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(271)

我想,对于一个相机应用程序,以避免重画的活动方向的变化。到目前为止我一直在用 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
    }
}

现在,它应该启动onconfigurationchanged,而不是重新启动活动(假设它将在onconfigurationchanged中处理)
实际上,当方向改变时,onconfigurationchanged被触发,但除了不需要的旋转之外。如何取消?我错过了什么?
设备:小米mi2s api:4.1.1
谢谢,马克。

fkvaft9z

fkvaft9z1#

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

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

正如您所看到的,您所需要做的只是将null传递给onconfigurationchanged的super方法,因此它实际上会阻止您进行所有您希望避免的更改。
当做!

5gfr0r5j

5gfr0r5j2#

试试这个:

@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);
}

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

bkkx9g8r

bkkx9g8r3#

好吧,在传统的方法失败后,我决定自己执行方向改变程序。
为此,首先,我回来了 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

        }
    };

很有魅力。

相关问题