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

161

我正在使用 Android 上的 VNC 观看器,在我的 HTC G1 上。但出于某种原因,该应用程序始终处于横屏模式,尽管我的 G1 处于竖屏模式。由于 Android VNC 观看器是开源的,我想知道如何硬编码活动为“横向”。我想将其更改为遵守手机方向。

16个回答

2

在Activity中添加以下行

您需要在每个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>

1
在代码中这样做在我看来是错误的,特别是如果你将其放入 onCreate 中。在 manifest 中完成,并且“系统”从应用程序启动时就知道方向。这种类型的元数据或顶层“指导”应该在清单中。如果你想证明它,请在 Activity 的 onCreate 中设置一个断点。如果你在代码中这样做,它会被调用两次:它以纵向模式启动,然后切换到横向模式。如果在 manifest 中完成,则不会发生这种情况。

1
我不同意。与通过清单进行操作相比,以代码的形式进行任何操作始终是我的首选方法。基于单一职责原则,清单应仅涉及应用程序级别属性、权限和API绑定。实际上,我不同意在应用程序清单中存在<activity>标记,因此我从未将其放入其中(而且它可以正常工作)。如何呈现活动显然是一个表示问题。您的活动应该完全负责它的呈现方式,因此我通常将所有表示逻辑放在视图/活动代码中。 - ComeIn

0

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

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

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


警告:不良实践!这与强制将活动设置为横向模式无关。您始终需要实现存储和恢复活动状态。这是基本的Android开发知识。不要使用这种hacky修复方法来解决问题。如果系统需要更多内存,它可以随时关闭活动。 - Roel
@Roel,这是防止活动在旋转设备时自动旋转回纵向的唯一方法。它可以防止这些配置更改影响活动。 - Peterdk
抱歉信息有点不悦,但是我已经测试并发现在横屏模式下不需要这些值。当你添加了这些值后,就意味着你要在onConfigurationChanged()中自己处理这些变化,而不是让activity重新启动(这也需要你进行实现!),但如果你强制横屏旋转是不会发生的。 - Roel
嗨,其中一些可能不是必需的,但省略所有这些将导致奇怪的旋转问题。我现在无法测试,但当我开发需要始终处于横向模式的应用程序时,仅使用 orientation|screensize 在某些情况下是不够的。它会自动旋转回纵向模式。 - Peterdk
这些配置更改也用于Google移动广告和其他广告SDK中。那时我就是从那里得到它们的。 - Peterdk
并不总是错误的使用它们,但您需要记住,当您的活动重新启动时,您必须始终实现保存和恢复状态,以便用户在发生这种情况时不会注意到。 - Roel

0

只使用
android:screenOrientation="portrait" tools:ignore="LockedOrientationActivity"


0
在调用setLayout方法之前,在您的onCreate方法中使用ActivityInfo(android.content.pm.ActivityInfo),如下所示:
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

-27

按下 CTRL+F11 可以旋转屏幕。


3
他们想知道如何设置应用程序的默认方向,而不是如何旋转屏幕。 - kyle k
按下 CTRL+f12 可以启动模拟器。 - Lazy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接