sensorPortrait:如何捕捉方向变化?

时间:2012-09-16 15:34:15

标签: android android-layout android-orientation

我正在开发一个只支持两种方向的应用程序,纵向和纵向,所以我在清单中写了“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自动旋转,然后是正确的布局。它看起来不可接受,你知道如何解决它吗?

3 个答案:

答案 0 :(得分:9)

我建议您使用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

更新

您可以在onStop()中使用方法getChangingConfigurations()来确定导致活动被销毁的配置更改。在这种情况下,您无需使用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);
    }
    ...
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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