Android在运行时确定屏幕方向

时间:2012-02-29 23:53:27

标签: android runtime orientation

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

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(),我可以处理方向,但不需要我手动重绘视图。

6 个答案:

答案 0 :(得分:45)

首先需要Display个实例:

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

然后可以这样调用方向:

int orientation = display.getOrientation();

检查方向并将其用于更改方向

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

我希望它有所帮助。

更新

好吧,假设你有oAllow var,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()已弃用see here。而是使用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            
}

答案 1 :(得分:18)

尝试运行

getResources().getConfiguration().orientation

从上下文对象中确定运行时的屏幕方向,可记录的值here

为了捕捉方向更改事件,您可以在Android开发指南中找到答案:Handling the Configuration Change Yourself

从指南中:

  

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

     

&lt; activity android:name =“。MyActivity”
            机器人:configChanges = “方向| keyboardHidden”
            机器人:标签= “@串/ APP_NAME” &GT;
  
  现在,当其中一个配置发生更改时,MyActivity不会重新启动。相反,MyActivity接收对onConfigurationChanged()的调用。此方法传递一个Configuration对象,该对象指定新设备配置。通过读取“配置”中的字段,您可以确定新配置并通过更新界面中使用的资源进行适当的更改。在调用此方法时,您的活动的Resources对象会更新以根据新配置返回资源,因此您可以轻松重置UI的元素,而无需系统重新启动您的活动。

...

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

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

这里要注意的是,如果在Jellybean及以上,这将允许在锁定时旋转180度。此外,当解锁时,如果用户的主设置允许旋转,则仅允许旋转。您可以禁止180度旋转并覆盖主设置并允许旋转等等,因此请查看ActivityInfo

中的选项

此外,如果您已经预先设定了没有旋转,那么您的活动将不会被销毁然后重新启动,只是为了您将方向设置回来,这将再次导致活动重新启动;因此,提前设置您想要的内容可以更高效

前果冻使用ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE - 没有180度旋转。

答案 4 :(得分:0)

在运行时检查您的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);
}

答案 5 :(得分:0)

确定屏幕方向的另一种解决方案:

public boolean isLandscape() {
    return Resources.getSystem().getDisplayMetrics().widthPixels - Resources.getSystem().getDisplayMetrics().heightPixels > 0;
}