【问题标题】:Android determine screen orientation at runtimeAndroid 在运行时确定屏幕方向
【发布时间】:2012-02-29 23:53:27
【问题描述】:

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

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 度旋转。请在下面阅读我的答案,而不是选择的答案。

标签: android runtime orientation


【解决方案1】:

您首先需要一个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            
}

【讨论】:

  • 谢谢,但我应该把代码放在哪里?我的意思是当方向改变时会触发哪个事件/函数?
  • @kenyi 你想做什么?提供更多细节。你只需要处理方向还是什么?我会升级我的答案。
  • 在设备改变方向之前,我需要在运行时确定是否允许横向模式。假设如果用户关闭了横向模式,那么应用将保持纵向模式。
  • display.getOrientation();被贬低了。尝试使用 getResources().getConfiguration().orientation
  • 另外,Surface.ROTATION_90 是相对于屏幕的自然旋转,因此它可以是纵向或横向,具体取决于设备。
【解决方案2】:

尝试运行

getResources().getConfiguration().orientation

从您的上下文对象中找出运行时的屏幕方向,可能的值记录在here

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

来自指南:

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

android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">

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

...

【讨论】:

  • 嗨,我更新了我的问题。我知道如何检索屏幕方向,我需要知道在哪里处理它。
  • 嗨,请查看我回答中的最后一个链接...Handling the configuration change yourself。我用更多信息编辑了我的答案
【解决方案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
}

【讨论】:

    【解决方案4】:

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

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

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

    另外,如果你预先设置了不旋转,那么你的activity不会被销毁然后重启,只是为了你将方向设置回来,会再次导致activity重启;因此,提前设置您想要的内容会更有效率

    Pre Jellybean 使用 ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE -- 没有 180 度旋转。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-08
          • 1970-01-01
          • 1970-01-01
          • 2011-09-09
          • 2011-07-17
          • 1970-01-01
          • 1970-01-01
          • 2011-09-18
          相关资源
          最近更新 更多