在Android中强制纵向或横向模式取决于屏幕大小

时间:2013-01-08 17:46:15

标签: android landscape mode portrait

我在过去几个小时里一直在做一些研究,以及一些试验和错误,但是我无法为这个问题找到一个完全可行的解决方案。我只想强制我的Android应用程序保持纵向模式,除非屏幕尺寸足够大(平板电脑),这将迫使应用程序处于横向模式。

到目前为止我尝试过:

<activity android:screenOrientation="portrait" android:configChanges="orientation|keyboardHidden">

以及:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

在我的onCreate和onResume中。

第一个示例在某种程度上有效,但是如果它是平板电脑,这将不允许我检查屏幕尺寸并强制横向模式。此外,如果我在执行asynctask的同时将手机保持在横向模式,应用程序将在任务完成后进入横向模式,然后只要我留在手中,我就可以再次在纵向和横向之间切换同样的活动。

所以,我不确定如何正确处理这个问题?如果我使用第二个示例(使用更多代码允许我检查屏幕大小,然后根据大小选择布局),只要我在活动中就可以工作。但是,如果我在启动活动时以横向模式握住手机,一切都会崩溃(所以看起来代码在开始时效果不佳)。

任何可能完全没有任何“错误”的建议,现在就是这种情况,我们将非常感谢!

1 个答案:

答案 0 :(得分:0)

我意识到这已经很晚了,但这是我的答案,以防它可以帮助其他人。

我采用了程序化路线,在横向或纵向位置启动应用时没有遇到任何问题。

忽略清单选项。如你所述,在onCreate()中使用setRequestedOrientation()。检查屏幕大小,例如:

private boolean screenIsLarge()
{
    int screenMask = getResources().getConfiguration().screenLayout;
    if ( ( screenMask & Configuration.SCREENLAYOUT_SIZE_MASK) == 
            Configuration.SCREENLAYOUT_SIZE_LARGE) {
        return true;
    }

    if ( (screenMask & Configuration.SCREENLAYOUT_SIZE_MASK) == 
            Configuration.SCREENLAYOUT_SIZE_XLARGE) {
                return true;
    }

    return false;

}

您可以修改此项以包含Configuration中列出的其他屏幕尺寸。根据此结果,您可以选择是否将屏幕设置为横向。

if( screenIsLarge() )
{
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}