Android运行时确定屏幕方向

22

以下是伪代码,用于检测屏幕旋转事件,并决定保留或更改屏幕方向。

public boolean onOrientationChanges(orientation) {
  if(orientation == landscape)
    if(settings.get("lock_orientation"))
      return false;   // Retain portrait mode
    else
      return true; // change to landscape mode

  return true; 
}

我该如何在Android中制作类似的东西?

编辑: 实际上,我正在寻找有关在哪里处理方向更改的答案。 我不想通过添加screenOrientation =“portrait”来固定方向。

我需要类似于onConfigurationChanges()的东西,可以处理方向,但不需要手动重绘视图。


您不需要拦截请求,然后允许或拒绝它。您可以提前锁定或释放方向。这种方法还有更多选项,例如在锁定时是否允许180度旋转。请阅读我的答案,而不是所选的答案。 - Steve Waring
6个回答

52

首先需要一个Display实例:

Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

那么方向可以这样调用:

int orientation = display.getOrientation();

按照您的方式检查方向,并使用此方法来更改方向

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

希望它有所帮助。

更新:

好的,假设你有一个名为oAllow的变量,它是Boolean类型,默认值为False

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
    int orientation = display.getOrientation(); 
    switch(orientation) {
        case Configuration.ORIENTATION_PORTRAIT:
            if(!oAllow) {
                    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            }
            break;
        case Configuration.ORIENTATION_LANDSCAPE:
            if(!oAllow) {
                    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
            break;
    }
}

您可以添加更多选项。

我没有尝试过这个示例,但至少告诉了您一些关于如何解决问题的线索。如果您遇到任何错误,请告诉我。

更新

getOrientation()已经被弃用,请在此处查看。相反,请使用getRotation()。要检查设备是否处于横向模式,您可以执行类似以下的操作:

Display display = ((WindowManager) getSystemService(WINDOW_SERVICE))
        .getDefaultDisplay();

int orientation = display.getRotation();

if (orientation == Surface.ROTATION_90
        || orientation == Surface.ROTATION_270) {
    // TODO: add logic for landscape mode here            
}

谢谢,但我应该把代码放在哪里?我的意思是当方向改变时触发哪个事件/函数? - Bananakilo
抱歉,onOrientationChanges只是我的伪代码,在Android中并没有这样的事件。我正在寻找可以替换onOrientationChanges的代码片段。 - Bananakilo
嗨,如果您正在根据布局执行某些操作..在方向变化期间。这种方法并不是很有帮助。 - Gnanam R
6
display.getOrientation(); 已过时,请尝试使用 getResources().getConfiguration().orientation。 - 0xPixelfrost
1
另外,Surface.ROTATION_90是相对于屏幕的自然旋转而言的,因此它可能是纵向或横向,具体取决于设备。 - Steve Waring
显示剩余7条评论

21

尝试运行

getResources().getConfiguration().orientation

通过上下文对象来查找运行时屏幕方向,可能值的文档记录在这里

要捕获方向更改事件,可以在Android Dev Guide中找到答案:Handling the Configuration Change Yourself

从指南中:

例如,以下清单代码声明了一个处理屏幕方向和键盘可用性变化的活动:

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

现在,当其中一个配置更改时,MyActivity不会重新启动。相反,MyActivity接收到对onConfigurationChanged()的调用。该方法传递了一个指定新设备配置的Configuration对象。通过读取Configuration中的字段,您可以确定新配置并通过更新界面中使用的资源进行适当的更改。在调用此方法时,您的活动的Resources对象已更新为根据新配置返回资源,因此您可以轻松重置UI元素,而无需系统重新启动您的活动。

...


嗨,我更新了我的问题。我知道如何检索屏幕方向,但我需要知道在哪里处理它。 - Bananakilo
嗨,请查看我的回答中的最后一个链接...自己处理配置更改。我编辑了我的回答并添加了一些信息。 - Talihawk

4
if (this.getWindow().getWindowManager().getDefaultDisplay()
    .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
  // portrait mode
} else if (this.getWindow().getWindowManager().getDefaultDisplay()
           .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
  // landscape
}

2
另一种确定屏幕方向的解决方案:
public boolean isLandscape() {
    return Resources.getSystem().getDisplayMetrics().widthPixels - Resources.getSystem().getDisplayMetrics().heightPixels > 0;
}

1

您不需要拦截事件然后覆盖它。只需使用:

// Allow rotation
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
// Lock rotation (to Landscape)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE);

注意事项:如果使用的是Jellybean及以上版本,锁定屏幕后可以进行180度旋转。此外,在未锁定屏幕时,只有在用户的主设置允许旋转时才允许旋转。您可以禁止180度旋转并覆盖主设置以允许旋转等等,请查看ActivityInfo中的选项。
另外,如果预设不允许旋转,则您的活动将不会被销毁和重新启动,仅为了再次设置方向而导致活动重新启动;因此提前设置所需的内容可能更加高效。
在Jellybean之前的版本中,请使用ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE - 这不会有180度旋转。

1

在运行时检查您的Android屏幕方向:

ListView listView = (ListView) findViewById(R.id.listView1);
if (getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
    //do work for landscape screen mode.
    listView.setPadding(0, 5, 0, 1);
} else if (getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
    //Do work for portrait screen mode.
    listView.setPadding(1, 10, 1, 10);
}

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