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

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

我想,对于一个相机应用程序,以避免重画的活动方向的变化。到目前为止我一直在用 android:screenOrientation="landscape" 现在我想图标旋转根据方向的变化。
好吧,这应该非常简单:首先删除上面的代码行。然后在活动的清单中设置:

  1. android:configChanges="orientation|screenSize|keyboardHidden"

最后,重写活动中的onconfigurationchanged:

  1. @Override
  2. public void onConfigurationChanged(Configuration newConfig) {
  3. super.onConfigurationChanged(newConfig);
  4. if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
  5. //Do something
  6. } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
  7. //Do something
  8. }
  9. }

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

fkvaft9z

fkvaft9z1#

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

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

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

5gfr0r5j

5gfr0r5j2#

试试这个:

  1. @Override
  2. public void onConfigurationChanged(Configuration newConfig) {
  3. if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
  4. //Do something
  5. } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
  6. //Do something
  7. }
  8. super.onConfigurationChanged(newConfig);
  9. }

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

bkkx9g8r

bkkx9g8r3#

好吧,在传统的方法失败后,我决定自己执行方向改变程序。
为此,首先,我回来了 android:screenOrientation="landscape" 到舱单上。
然后,我用一些数学实现了传感器侦听器回调:

  1. private SensorEventListener listener = new SensorEventListener() {
  2. public void onSensorChanged(SensorEvent e) {
  3. if (e.sensor.getType()==Sensor.TYPE_ACCELEROMETER) {
  4. float x = e.values[0];
  5. float y = e.values[1];
  6. //update _angle in rotate()
  7. if (Math.abs(y) / Math.abs(x) < 1.0)
  8. {
  9. if (x<0 && _angle != 270f)
  10. rotate(270f);
  11. else if(x>=0 && _angle != 90f)
  12. rotate(90f);
  13. }
  14. else
  15. {
  16. if (y<0 && _angle != 180f)
  17. rotate(180f);
  18. else if (y>=0 && _angle != 0f)
  19. rotate(0f);
  20. }
  21. }
  22. }
  23. @Override
  24. public void onAccuracyChanged(Sensor sensor, int accuracy) {
  25. // TODO Auto-generated method stub
  26. }
  27. };

很有魅力。

展开查看全部

相关问题