强制Android活动始终使用横向模式


144

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

Answers:


188

在第9行上查看AndroidManifest.xml(链接):

<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的外观,具体取决于布局的创建方式。您将不得不考虑这一点。另外,根据活动的编码方式,您可能会注意到,当改变屏幕方向时,填充在任何输入框中的值都会消失。这也可能必须处理。


3
为什么确切configChanges需要该属性?这似乎是我的非键盘手机,没有它的工作......在什么情况下会更改方向为纵向,如果你有screenOrientation="landscape",但省略了configChanges
Timmmm 2012年


如何强制仅在横向或纵向模式下进行诸如系统映像选择库之类的内置活动?
Jacky 2015年

118

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

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

ActivityInfo上的其他值可让您将其设置回传感器驱动或锁定的人像。就个人而言,我希望将其设置为清单中的内容,如对此问题的另一个答案所建议的,然后在需要时使用Android SDK中的上述调用对其进行更改。


@Yegor并非总是如此。来自android docs: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)
Chaitanya

40

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

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2
其他答案中的清单方法似乎不起作用,但您的@anwarma起作用了
Anup

31

您可以在清单中指定活动的方向。看这里

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

24

在清单中:

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

在您的活动中:

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

11

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

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

2
“方向”如果您的应用程序的目标是API级别13或更高级别,则还应该声明“ screenSize”
Mina Fawzy

7

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

android:screenOrientation="landscape"

5

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

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

4

而已!!期待已久的修复程序。

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

现在,Android在启动时启用横向模式。


3

Arslan,为什么您要以编程方式强制定位,尽管清单中已经有一种方法 <activity android:name=".youractivityName" android:screenOrientation="portrait" />


我不是询问者,但也许他想以编程方式强制执行,因为他想在特定时间强制执行?
Hamzah Malik 2014年

1

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


1
我不同意。在代码中执行任何操作(而不是通过清单)总是我的首选方法。根据单一责任原则,清单应仅与应用程序级别的属性,权限和API绑定有关。实际上,我不同意在应用程序清单中完全存在<activity>标记,因此我从来没有将它放在那里(并且效果很好)。如何呈现活动显然是呈现关注点。您的活动应该完全负责呈现方式,因此我通常将所有呈现逻辑都放在视图/活动代码中。
ComeIn

0

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

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

仅使用keyboardHidden|orientation电源会在按下电源按钮时导致内存泄漏和活动恢复。


不良做法提醒!这与在横向模式下强制活动无关。您始终需要实现活动状态的存储和重新创建。这是基本的Android开发知识。请勿使用此漏洞修复程序解决该问题。如果活动需要更多内存,则该活动始终可以由系统关闭。
Roel

@Roel,这是防止活动例如在旋转设备时旋转回纵向的唯一方法。这样可以防止这些configchange影响活动。
Peterdk

抱歉,我收到了一些脾气暴躁的消息,但我对其进行了测试,但对于横向模式我并没有所有这些值。当您添加所有这些值时,这意味着您可以在onConfigurationChanged()中自己处理更改,而不是仅重新启动活动(并且必须实现该操作!),但是如果强制横向转换,则不会发生旋转。
Roel

嗨,也许不需要其中的一些,但是省略所有这些将导致怪异的轮换问题。我现在无法进行测试,但是当我开发的应用程序始终需要处于横向状态时,仅orientation|screensize在所有情况下使用都是不够的。它将自动旋转回纵向。
Peterdk

这些配置更改也用在Google移动广告和其他广告SDK中。那是我当时从那里得到的。
Peterdk

0

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

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);


0

在活动中添加以下行

您需要输入每个活动

用于景观

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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.