【问题标题】:sensorPortrait: How to catch orientation changing?sensorPortrait:如何捕捉方向变化?
【发布时间】:2012-09-26 14:24:27
【问题描述】:

我正在开发一个只支持两种方向的应用程序,纵向和反向纵向,所以我在清单中写了“sensorPortrait”,它运行良好。

问题是,我想为这两个方向使用不同的布局。

启用sensorPortrait 会禁用“onConfigurationChange”调用。

我用:

orientationEventListener = new OrientationEventListener(this) {
        @Override
        public void onOrientationChanged(int i) {
            int newOrientation = getScreenOrientation();
            if (newOrientation != orientation) {
                orientation = newOrientation;
                if (newOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
                    ...
                    setContentView(R.layout.main);

                } else if (newOrientation == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT) {
                    ...
                    setContentView(R.layout.main_reverse_portrait);
                }
            }
        }
    };
    orientationEventListener.enable();

问题是在更改方向后调用此代码,因此当用户首先旋转手机时,他们会看到之前的布局,Android 自动旋转,然后是正确的布局。看起来无法接受,您知道如何解决吗?

【问题讨论】:

    标签: android android-layout android-orientation


    【解决方案1】:

    我建议您使用 configChanges 并覆盖 onConfigurationChanged(Configuration newConfig) 方法。如果不是您支持的方向,请忽略方向。

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
             ...
             setContentView(R.layout.main);
        } else if (newOrientation == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT) {
             ...
             setContentView(R.layout.main_reverse_portrait);
        }
    }
    

    这个答案可能会进一步帮助你。

    Android: Detect Orientation Changed

    更新:

    有一个方法getChangingConfigurations(),您可以在onStop() 中使用它来确定是什么配置更改导致活动被破坏。在这种情况下,您不需要使用 onConfigurationChanged() 回调。

    更新 2:

    使用sensorPortrait 并在onCreate 中手动检查旋转角度。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        Display display = ((WindowManager)  
              context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        int rotation = display.getRotation();
        if (rotation == Surface.ROTATION_180) { // reverse portrait
           setContentView(R.layout.main_reverse_portrait);
        } else {  // for all other orientations
           setContentView(R.layout.main);
        }
        ...
    }
    

    【讨论】:

    • 我只想补充一点,在几乎所有情况下,您都希望支持所有方向。当用户旋转设备但没有任何反应时,总是令人沮丧。在某些情况下,您想要强制定向,但 99% 的情况下,您应该支持所有定向。
    • 有时取决于客户=(当然这不是我自己的决定
    • 也许我不明白方向的概念。但我认为如果启用所有方向,屏幕坐标就会旋转。我的意思是 android 会为横向使用纵向布局,它看起来会很糟糕。不?忽略其他方向是什么意思?任何代码将不胜感激。我有两个纵向和反向布局文件。
    • 这个答案会对你有所帮助.. stackoverflow.com/questions/8248274/…
    【解决方案2】:

    如果你调试你会注意到 onConfigurationChanged 为少数配置被调用了两次(我认为它曾经在进入横向模式时调用两次)。所以你的问题就在那里。 因为 onConfigurationChanged 将调用 setContent 两次。 U 应该通过比较当前显示宽度与旧宽度或类似的东西来避免这种情况。如果这不起作用,请告诉我,然后我自己尝试:) gl!

    【讨论】:

    • 如果我快速旋转设备 - 比不旋转,它只调用一次方法,但如果我慢慢旋转 - 比是,两次。但我看不出有什么问题,因为我的方法总是使用正确的布局(android也不会自动)
    • 更新。以前是错误的......我注意到当我快速旋转设备时 - 它不会调用该方法!我猜它只涵盖纵向->横向,反之亦然配置更改。我想这对我没有帮助=(..
    【解决方案3】:

    您可以尝试编写代码以使布局对应用的 onPause 中的用户通知不可见。

    这可能有助于让事情变得更好

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-21
      • 2018-08-31
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多