如何获得当前的屏幕方向?


190

我只想在方向为横向时设置一些标志,以便在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将阻止我的布局土地xml以横向加载。

我只想在onCreate()中获取设备的当前方向。我怎么能得到这个?

Answers:


474
Activity.getResources().getConfiguration().orientation

8
这仅提供两个值ORIENTATION_PORTRAIT和ORIENTATION_LANDSCAPE。有没有办法从ActivityInfo获取所有四个值?(也就是LANDSCAPE_REVERSE和PORTRAIT_REVERSE)
HRJ

18
@HRJ您可以使用getWindowManager()。getDefaultDisplay()。getRotation()
MKJParekh 2011年

24
getWindowManager()。getDefaultDisplay()。getRotation()返回相对于显示器“自然”方向的旋转,即对于平板电脑,它将在横向模式下返回Surface.ROTATION_0,而对于手机,它将返回相同的值。肖像。
佐尔坦

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

当的超类thisContext


28

在某些设备中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 2015年

1
应标记为正确答案,并在所有情况下均能发挥最佳效果。但是请注意,正如anivaler所说,现在不赞成使用getActivity()。getWindowManager()。getDefaultDisplay()。getWidth()和getHeight()。请使用getSize(Point outsize)。它可以用作传递新的点对象,并将获得其x和y成员。
Mahendra Chhimwal 2015年

像Point outSize = new point(); getOrient.getSize(outSize); if(outSize.x == outSize.y)return SQUARE;
Mahendra Chhimwal 2015年

我想指出的是,不建议使用Configuration.ORIENTATION_SQUARE,虽然在2013年可能将其定义为0,但将其定义为3,而将Configuration.ORIENTIATION_UNDEFINED定义为0。欢呼。
戴夫

26
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;
}

final int angle = (rotation == Surface.ROTATION_90) ? 90 : (rotation == Surface.ROTATION_180) ? 180 : (rotation == Surface.ROTATION_270) ? 270 : 0;
Andrey Syrokomskiy



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.onConfigyrationChanged()作为重写方法中的第一条语句。


0

我只想提出另一种与您有关的替代方法:

android:configChanges="orientation|keyboardHidden" 

表示我们明确声明要注入的布局。

万一我们希望保留自动注入功能,这要归功于layout-land和layout文件夹。您所要做的就是将其添加到onCreate中:

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

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

在这里,我们根据手机的方向显示或不显示操作栏

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.