【问题标题】:Force an Android activity to always use landscape mode强制 Android 活动始终使用横向模式
【发布时间】:2011-01-10 03:41:12
【问题描述】:

我在 HTC G1 上使用 Android VNC 查看器。但由于某种原因,尽管我的 G1 处于纵向模式,但该应用程序始终处于横向模式。由于 Android VNC 查看器是开源的,我想知道如何将活动硬编码为“风景”。我想改变它以尊重手机方向。

【问题讨论】:

    标签: android landscape android-orientation


    【解决方案1】:

    查看 AndroidManifest.xml (link),第 9 行:

    <activity android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden" android:name="VncCanvasActivity">
    

    这一行将screenOrientation 指定为横向,但作者更进一步使用configChanges="orientation|keyboardHidden" 覆盖任何屏幕方向更改。这指向 VncCanvasActivity.java 中的一个被覆盖的函数。

    如果查看 VncCanvasActivity,第 109 行是被覆盖的函数:

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
      // ignore orientation/keyboard change
      super.onConfigurationChanged(newConfig);
    }
    

    作者特地发表评论以忽略任何键盘或方向变化。


    如果你想改变这个,你可以回到上面显示的 AndroidManifest.xml 文件,并将该行更改为:

    <activity android:screenOrientation="sensor" android:name="VncCanvasActivity">
    

    这应该会改变程序在用户旋转设备时从纵向切换到横向。

    这可能有效,但可能会弄乱 GUI 的外观,具体取决于布局的创建方式。你将不得不考虑这一点。此外,根据活动的编码方式,您可能会注意到,当屏幕方向发生变化时,填充到任何输入框中的值都会消失。这也可能需要处理。

    【讨论】:

    【解决方案2】:

    您也可以在您的 java 代码中设置相同的数据。

    myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    

    ActivityInfo 上的其他值可让您将其设置回传感器驱动或锁定纵向。就个人而言,我喜欢将其设置为 Manifest 中的某个内容,如该问题的另一个答案中所建议的那样,然后如果需要,稍后使用 Android SDK 中的上述调用进行更改。

    【讨论】:

    • @Yegor 并非总是如此。来自安卓文档:If the activity is currently in the foreground or otherwise impacting the screen orientation, the screen will immediately be changed (possibly causing the activity to be restarted)
    【解决方案3】:

    在我的OnCreate(Bundle) 中,我通常会执行以下操作:

    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    

    【讨论】:

    • 其他答案中的 manifest 方法似乎不起作用,但 @anwarma yours 起作用了
    【解决方案4】:

    您可以在清单中指定活动的方向。见here

    <activity android:allowTaskReparenting=["true" | "false"]
    ...
              android:screenOrientation=["unspecified" | "user" | "behind" |
                                         "landscape" | "portrait" |
                                         "sensor" | "nosensor"]
    ...
                                           "adjustResize", "adjustPan"] >  
    

    【讨论】:

      【解决方案5】:

      在清单中:

      <activity  android:name=".YourActivity"
      android:screenOrientation="portrait"
      android:configChanges="orientation|screenSize">
      

      在你的活动中:

      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
      setContentView(R.layout.your_activity_layout);
      

      【讨论】:

        【解决方案6】:

        以下是我用来在横向模式下显示所有活动的代码:

        <activity android:screenOrientation="landscape"
                  android:configChanges="orientation|keyboardHidden"
                  android:name="abcActivty"/>
        

        【讨论】:

        • "orientation" 如果您的应用程序以 API 级别 13 或更高级别为目标,那么您还应该声明“screenSize”
        【解决方案7】:

        AndroidManifest.xml 文件是一个快速简单的解决方案,为您希望强制进入横向模式的每个活动添加以下内容:

        android:screenOrientation="landscape"
        

        【讨论】:

          【解决方案8】:

          这适用于 Xamarin.Android。在 OnCreate() 中

          RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape;
          

          【讨论】:

            【解决方案9】:

            就是这样!!等这个修复好久了。

            我有一个关于双启动需要(以编程方式)横向模式的活动的旧 Android 问题:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

            现在 Android 会在启动时设置横向模式。

            【讨论】:

              【解决方案10】:

              阿尔斯兰, 为什么要以编程方式强制定向,尽管清单中已经有一种方法 &lt;activity android:name=".youractivityName" android:screenOrientation="portrait" /&gt;

              【讨论】:

              • 我不是提问者,但也许他想以编程方式强制,因为他想在某个时间强制它?
              【解决方案11】:

              在 Activity 中添加以下行

              您需要在每个活动中输入

              横向

              android:screenOrientation="landscape"
              tools:ignore="LockedOrientationActivity"
              

              肖像

              android:screenOrientation="portrait"
              tools:ignore="LockedOrientationActivity"
              
              

              这里是 MainActivity 的例子

              <?xml version="1.0" encoding="utf-8"?>
              <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                  xmlns:tools="http://schemas.android.com/tools"
                  package="org.thcb.app">
                  <application
                      android:allowBackup="true"
                      android:icon="@mipmap/ic_launcher"
                      android:label="@string/app_name"
                      android:roundIcon="@mipmap/ic_launcher_round"
                      android:supportsRtl="true"
                      android:theme="@style/AppTheme">
              
                      <activity android:name=".MainActivity"
                          android:screenOrientation="landscape"
                          tools:ignore="LockedOrientationActivity">
                          <intent-filter>
                              <action android:name="android.intent.action.MAIN" />
                              <category android:name="android.intent.category.LAUNCHER" />
                          </intent-filter>
                      </activity>
              
                      <activity android:name=".MainActivity2"
                          android:screenOrientation="portrait"
                          tools:ignore="LockedOrientationActivity">
                          <intent-filter>
                              <action android:name="android.intent.action.MAIN" />
                              <category android:name="android.intent.category.LAUNCHER" />
                          </intent-filter>
                      </activity>
                  </application>
              </manifest>
              

              【讨论】:

                【解决方案12】:

                在代码中执行此操作是 IMO 错误的,如果您将其放入 onCreate.在清单中执行此操作,“系统”从应用程序启动时就知道方向。这种类型的元或顶级“指导”应该在清单中。如果您想向自己证明这一点,请在 Activity 的 onCreate 中设置一个中断。如果您在代码中执行此操作,它将被调用两次:它以纵向模式启动,然后切换到横向模式。如果您在清单中执行此操作,则不会发生这种情况。

                【讨论】:

                • 我不同意。在代码中而不是通过清单做任何事情始终是我的首选方法。基于单一职责原则,清单应该只关注应用程序级别的属性、权限和 API 绑定。实际上,我完全不同意应用程序清单中存在 标记,因此我从未将它放在那里(而且它工作正常)。活动如何呈现显然是一个呈现问题。您的活动应该单独负责它的呈现方式,因此我通常将所有呈现逻辑放在视图/活动代码中。
                【解决方案13】:

                对于Android 4.0(冰淇淋三明治)及更高版本,除了landscape 值之外,我还需要添加这些。

                android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
                

                仅使用keyboardHidden|orientation 仍会导致内存泄漏,并在按下电源按钮时重新创建我的活动。

                【讨论】:

                • 不良做法警告!这与强制以横向模式进行活动无关。您总是需要实现活动状态的存储和重新创建。这是基本的Android开发知识。不要用这个 hacky 修复来解决这个问题。如果活动需要更多内存,系统总是可以关闭活动。
                • @Roel,这是防止活动旋转回纵向的唯一方法,例如,当您旋转设备时。它可以防止这些配置更改影响活动。
                • 对不起,有点脾气暴躁的消息,但我测试了它,我没有将所有这些值用于横向模式。当您添加所有这些值时,这意味着您自己在 onConfigurationChanged() 中处理更改,而不是刚刚重新启动活动(并且您必须实现它!)但是如果您强制景观,则不会发生轮换。
                • 您好,其中一些可能不需要,但省略所有这些会导致奇怪的轮换问题。我现在无法测试,但是当我开发一个需要一直处于横向状态的应用程序时,在所有情况下仅使用 orientation|screensize 是不够的。它会自动旋转回纵向。
                • 这些配置更改也用于 Google 移动广告和其他广告 SDK。我当时就是从那里得到它们的。
                【解决方案14】:

                在像这样调用 setLayout 方法之前,在 onCreate 方法中使用 ActivityInfo (android.content.pm.ActivityInfo)

                this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                

                【讨论】:

                  【解决方案15】:

                  仅使用
                  安卓:screenOrientation="人像" 工具:ignore="LockedOrientationActivity"

                  【讨论】:

                    【解决方案16】:

                    CTRL+F11 旋转屏幕。

                    【讨论】:

                    • 他们现在想知道如何设置应用程序的默认方向,而不是如何旋转屏幕。
                    • CTRL+f12 用于模拟器。
                    猜你喜欢
                    • 1970-01-01
                    • 2012-02-14
                    • 2012-06-15
                    • 1970-01-01
                    • 2013-08-28
                    • 2016-09-12
                    • 1970-01-01
                    相关资源
                    最近更新 更多