3

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

4

3 回答 3

9

我建议您使用configChangesand 覆盖该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:检测方向已更改

更新:

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);
    }
    ...
}
于 2012-09-19T11:03:26.563 回答
0

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

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

于 2012-09-26T06:24:27.027 回答
0

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

于 2012-09-24T06:36:25.037 回答