禁用屏幕方向但检测屏幕方向

5

我有一个活动。这个活动可以在竖屏或横屏模式下工作。在横屏模式下,我加载一个新的布局来显示一个图表。 为了检测方向,我在清单文件中进行了如下设置:

android:screenOrientation="sensor" android:configChanges="orientation"

它的工作非常完美,因为当我翻转手机时,新布局就被加载了。但是,在横屏模式下,用户可以通过一个按钮(它是一个开关)来禁用/启用旋转。
我编写了以下代码:
public void onConfigurationChanged(Configuration pNewConfig) {
    Log.v(DEBUG_TAG, "Current configuration changes");

    if (pNewConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Log.v(DEBUG_TAG, "Screen orientation : LANDSCAPE");
        if (pNewConfig.orientation != mCurrentOrientation) {
            initTestLandscape();
            mCurrentOrientation = pNewConfig.orientation;
        }
    } else {
        Log.v(DEBUG_TAG, "Screen orientation : PORTRAIT");
        if (!mIsLandscapeLocking
                && pNewConfig.orientation != mCurrentOrientation) {
            initTestPortrait();
            mCurrentOrientation = pNewConfig.orientation;
        }
    }
    super.onConfigurationChanged(pNewConfig);
}

这段代码有效,但当用户处于横屏模式并将手机翻转到竖屏模式且锁定时,横屏布局会在竖屏模式下翻转,我不想要这样的效果!

我已经添加了

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

但是这段代码禁用了onConfigurationChanged方法,我无法检测用户是否再次翻转手机......

你能帮助我吗?


4
很简单...当用户锁定视图时,我调用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);,当用户解锁时,则调用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);...这很容易,我为什么没有想到这个解决方案?对造成的任何不便请谅解。 - FinalSpirit
值得注意的是,如果用户在视图向右旋转而不是向左旋转时锁定屏幕,您为自己提供的解决方案仍然会表现出奇怪的行为。 视图将翻转过来,因为您正在锁定到“SCREEN_ORIENTATION_LANDSCAPE”,这意味着只有一侧。 您可能需要使用“SCREEN_ORIENTATION_SENSOR_LANDSCAPE”,它将保持在横向模式下,但仍会监听设备传感器,以便用户切换到手机/平板电脑的相反侧面。 - SDJMcHattie
是的,您必须使用SCREEN_ORIENTATION_SENSOR_LANDSCAPE来替代SCREEN_ORIENTATION_LANDSCAPE,但是当我发布这个主题时,我使用的是不支持SCREEN_ORIENTATION_SENSOR_LANDSCAPE的Android 8。 - FinalSpirit
好的观点!抱歉我在发表评论时没有意识到这篇文章已经很老了。 - SDJMcHattie
1个回答

0

在android:configChanges中进行更改:

  android:configChanges="orientation|screenSize|keyboard|keyboardHidden"

在更改后,您的代码应该可以正常工作


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接