【问题标题】:How to Lock screen orientation when displaying reverse landscape in android?在android中显示反向横向时如何锁定屏幕方向?
【发布时间】:2011-09-18 14:36:57
【问题描述】:

我试图在 android 应用程序中锁定屏幕orientation。当特定按钮点击触发时,我使用以下代码锁定屏幕方向。

// Inside button click

Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
 if (display.getOrientation() == 1) {
                   setRequestedOrientation(0);
 } else if (display.getOrientation() == 0) {
                   setRequestedOrientation(1);
 } else if (display.getOrientation() == 3) {
                   setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
 }

以上代码适用于横向和纵向屏幕方向,但不适用于反向横向模式。在这种情况下,我的活动总是将 orientation 更改为默认 landscape 模式。我还注意到,当设备处于反向横向模式时, display.getOrientation() 总是返回 3。
我怎样才能找到这个问题的解决方案?

【问题讨论】:

    标签: android screen-orientation


    【解决方案1】:

    嗨,如果你想锁定屏幕方向,你必须设置清单文件

    <activity android:configChanges="orientation|keyboardHidden"
            android:screenOrientation="portrait" android:name=".activities.HomeActivity"
            android:label="@string/app_name" android:theme="@style/Theme.Translucent">
    

    【讨论】:

    • Thanx。但我需要在运行时做。另外我想覆盖服务绑定的 onRetainNonConfigurationInstance() 方法。
    • 实际上我想在特定按钮单击触发时锁定屏幕方向。所以我不想在清单中添加条目。其他事情是我上面的代码在横向和纵向屏幕上都可以正常工作。问题只发生屏幕处于反向横向模式。在该模式下,屏幕始终将其方向更改为默认横向模式。
    【解决方案2】:

    试试这个

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    

    如果你想要肖像

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    

    【讨论】:

    • 是的。我知道这一点。但是我想在我的屏幕处于反向横向模式时锁定屏幕。你知道有称为 REVERSE_LANDSCAPE 的方向模式吗?
    【解决方案3】:

    我一直在使用 API 8 处理同样的问题。看起来像在 reserseLandscape 模式下,如果你调用

    getResources().getConfiguration().orientation 
    

    Android 将返回 2 (SCREEN_ORIENTATION_USER),它根本不会锁定方向。事实上,即使值实际存在,也没有为 ActivityInfo 类定义常量 SCREEN_ORIENTATION_REVERSE_LANDSCAPE。 对于我的应用,我最终创建了这个方法:

    public void lockScreenOrientation() {
        switch (((WindowManager) getSystemService(WINDOW_SERVICE))
            .getDefaultDisplay().getRotation()) {
        case Surface.ROTATION_90: 
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
            break;
        case Surface.ROTATION_180: 
            setRequestedOrientation(9/* reversePortait */); 
            break;          
        case Surface.ROTATION_270: 
            setRequestedOrientation(8/* reverseLandscape */); 
            break;
        default : 
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
        }
    }
    

    每当我需要锁定方向时我都会调用这个方法,然后我可以简单地释放它调用

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    

    希望对您有所帮助。

    【讨论】:

    • 不错的一个!考虑到请求方向锁定的线程数量,我很惊讶你没有几十个赞成票。
    • @tricknology 请注意,这是 API 8 的老技巧。您使用的是什么 API,遇到了什么错误?
    • @autremoi,API 11+ 用户界面只是手。没有 FC 或 ANR,但我无法单击任何内容。我发布的答案对我有用。
    • 什么时候设置为未指定?
    • 什么时候调用 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); ?
    【解决方案4】:

    在您的 AndroidManifest 文件中,只需输入以下代码:

            android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
            android:screenOrientation="reverseLandscape"
    

    示例:

        <activity
            android:name="com.gaspar.slinfilipino.Quiz"
            android:label="@string/title_activity_quiz"
            android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
            android:screenOrientation="reverseLandscape"
            android:parentActivityName="com.gaspar.slinfilipino.SignLanguageMenu" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.gaspar.slinfilipino.SignLanguageMenu" />
        </activity>
    

    它对我有用。希望对您有所帮助!

    【讨论】:

      【解决方案5】:
      public void lockScreenOrientation() {
          switch (((WindowManager) getSystemService(WINDOW_SERVICE))
              .getDefaultDisplay().getRotation()) {
          case Surface.ROTATION_90: 
              setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
              break;
          case Surface.ROTATION_180: 
              setRequestedOrientation(9/* reversePortait */); 
              break;          
          case Surface.ROTATION_270: 
              setRequestedOrientation(8/* reverseLandscape */); 
              break;
          default : 
              setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
          }
      }
      

      autremoi 的答案对我有用,我创建了一个新的答案,因为我的声誉还不允许我投票给他。

      我的代码中唯一的区别是我用另一个恢复传感器

      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
      

      【讨论】:

      • 什么时候恢复传感器?
      【解决方案6】:

      我尝试了 autremoi 的答案,但它杀死了我的 UI。我找到了一个可行的答案,但是我发现这是混合的:https://www.captechconsulting.com/blogs/programmatically-locking-android-screen-orientation

      这个:getSize() giving me errors 有效,并且应该在所有 Android 版本上。

      setRequestedOrientation(lockOrientation());一起使用

      编码愉快!

      private int lockOrientation(){
          Display display = getWindowManager().getDefaultDisplay();
          int rotation = display.getRotation();
      
          Point size = new Point();
          size.x = display.getWidth();
          size.y = display.getHeight();
      
          int lock = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
      
          if (rotation == Surface.ROTATION_0
                  || rotation == Surface.ROTATION_180) {
              // if rotation is 0 or 180 and width is greater than height, we have
              // a tablet
              if (size.x > size.y) {
                  if (rotation == Surface.ROTATION_0) {
                      lock = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
                  } else {
                      lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
                  }
              } else {
                  // we have a phone
                  if (rotation == Surface.ROTATION_0) {
                      lock = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
                  } else {
                      lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
                  }
              }
          } else {
              // if rotation is 90 or 270 and width is greater than height, we
              // have a phone
              if (size.x > size.y) {
                  if (rotation == Surface.ROTATION_90) {
                      lock = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
                  } else {
                      lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
                  }
              } else {
                  // we have a tablet
                  if (rotation == Surface.ROTATION_90) {
                      lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
                  } else {
                      lock = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
                  }
              }
          }
          return lock;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多