如何获取当前屏幕方向?

239

我只想在屏幕方向为横屏时设置一些标志,这样当Activity在onCreate()方法中被重新创建时,我可以在纵向和横向之间切换要加载的内容。我已经有了一个处理布局的layout-land.xml文件。

public void onConfigurationChanged(Configuration _newConfig) {

        if (_newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            this.loadURLData = false;
        }

        if (_newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            this.loadURLData = true;
        }

        super.onConfigurationChanged(_newConfig);
    }

重写onConfigurationChanged会阻止我的layout-land xml在横屏模式下加载。

我只想在onCreate()中获取设备的当前方向。我该如何获取?

9个回答

534
Activity.getResources().getConfiguration().orientation

16
这只提供了两个值ORIENTATION_PORTRAIT和ORIENTATION_LANDSCAPE。有没有办法从ActivityInfo中获取所有四个值?(即LANDSCAPE_REVERSE和PORTRAIT_REVERSE) - HRJ
21
你可以使用 getWindowManager().getDefaultDisplay().getRotation() 这段代码来获取屏幕的旋转方向。 - MKJParekh
29
getWindowManager().getDefaultDisplay().getRotation() 返回相对于显示器的“自然”方向的旋转角度,例如对于平板电脑而言,在横屏模式下会返回 Surface.ROTATION_0,而对于移动手机而言,在竖屏模式和横屏模式下都会返回同样的值。 - Zoltán

94
int orientation = this.getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
    // code for portrait mode
} else {
    // code for landscape mode
}

this的超类为Context


从我的测试来看,当this是一个Application时,这似乎是有效的。不过我想知道它是否保证在所有Android版本中都能正常工作。 - Eric

36
int rotation =  getWindowManager().getDefaultDisplay().getRotation();

这将提供所有方向,包括正常和反转

并像处理正常内容一样处理它

int angle = 0;
switch (rotation) {
    case Surface.ROTATION_90:
        angle = -90;
        break;
    case Surface.ROTATION_180:
        angle = 180;
        break;
    case Surface.ROTATION_270:
        angle = 90;
        break;
    default:
        angle = 0;
        break;
}

1
final int angle = (rotation == Surface.ROTATION_90) ? 90 : (rotation == Surface.ROTATION_180) ? 180 : (rotation == Surface.ROTATION_270) ? 270 : 0; - Andrii Syrokomskyi
请注意,这是相对于设备的“自然”方向。在平板电脑上,“0”表示横向,而在手机上,“0”表示纵向。 - ToolmakerSteve

30

在有些设备上,void onConfigurationChanged()可能会崩溃。用户将使用此代码获取当前屏幕方向。

public int getScreenOrientation()
{
    Display getOrient = getActivity().getWindowManager().getDefaultDisplay();
    int orientation = Configuration.ORIENTATION_UNDEFINED;
    if(getOrient.getWidth()==getOrient.getHeight()){
        orientation = Configuration.ORIENTATION_SQUARE;
    } else{ 
        if(getOrient.getWidth() < getOrient.getHeight()){
            orientation = Configuration.ORIENTATION_PORTRAIT;
        }else { 
             orientation = Configuration.ORIENTATION_LANDSCAPE;
        }
    }
    return orientation;
}

并使用

if (orientation==1)        // 1 for Configuration.ORIENTATION_PORTRAIT
{                          // 2 for Configuration.ORIENTATION_LANDSCAPE
   //your code             // 0 for Configuration.ORIENTATION_SQUARE
}

1
请注意,getOrient.getWidth()和getOrient.getHeight()现在已经过时。 - valerybodak
应该将其标记为正确答案,因为它更加详细。 - Zapnologica
1
应该被标记为正确答案,并在所有情况下都能正常工作。但请注意,anivaler说getActivity()。getWindowManager()。getDefaultDisplay()。getWidth()和getHeight()现在已经过时。请使用getSize(Point outsize)。它可以被用作传递新的point对象,并且将获取其x和y成员。 - Mahendra Chhimwal
像这样:Point outSize = new Point(); getOrient.getSize(outSize); 如果 (outSize.x == outSize.y) 返回 SQUARE; - Mahendra Chhimwal
我想指出,Configuration.ORIENTATION_SQUARE已经被弃用了。虽然在2013年它可能被定义为0,但现在它被定义为3,而Configuration.ORIENTIATION_UNDEFINED被定义为0。 干杯。 - Dave

15
getActivity().getResources().getConfiguration().orientation

这个命令返回整数值1,代表竖屏模式,返回整数值2,代表横屏模式。


4

如果有人想获得类似于传递给onConfigurationChanged(..)的那些reverseLandscapesensorLandscape等的有意义的方向描述,只需使用getRequestedOrientation()即可。


2
我想提出另一种选择,这可能会涉及到你们中的一些人:

最初的回答:

android:configChanges="orientation|keyboardHidden" 

这意味着我们需要明确声明要注入的布局。

如果我们想保持由layout-land和layout文件夹自动注入的布局,我们只需要在onCreate中添加它:

Original Answer翻译成“最初的回答”

    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
        getSupportActionBar().hide();

    } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        getSupportActionBar().show();
    }

在这里,我们根据手机的方向来显示或隐藏操作栏。

Original Answer翻译成"最初的回答"


1
在你的活动类中使用以下方法:
 @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

            setlogo();// Your Method
            Log.d("Daiya", "ORIENTATION_LANDSCAPE");

        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {

            setlogoForLandScape();// Your Method
            Log.d("Daiya", "ORIENTATION_PORTRAIT");
        }
    }

接下来,为了声明您的活动可以处理配置更改,请编辑您的清单文件中的适当元素,以包括android:configChanges属性,并设置一个代表您想要处理的配置的值。可能的值在android:configChanges属性的文档中列出(最常用的值是“orientation”,以防止屏幕方向更改时重新启动和“keyboardHidden”以防止键盘可用性更改时重新启动)。您可以使用管道|字符将多个配置值声明在属性中。

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">

就这样!!


0
如果你想要覆盖 onConfigurationChanged 方法但仍希望它执行基本操作,那么请在重写方法中的第一条语句中使用 super.onConfigurationChanged()。该语句将保证基本操作的正常执行。

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