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

161

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

16个回答

201

查看 AndroidManifest.xml (链接),第 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的外观。您需要考虑这一点。此外,根据活动的编码方式,您可能会注意到当屏幕方向更改时,填入任何输入框中的值会消失。这也可能需要处理。


3
configChanges属性的作用是什么?如果没有它,我的非键盘手机似乎也可以正常工作...如果省略了configChanges,在什么情况下会将屏幕方向更改为纵向,即使你已经使用了screenOrientation="landscape"?为确保应用程序能够正确处理配置更改(如旋转屏幕),需要使用configChanges属性。如果忽略了这个属性,当屏幕方向被设置为横向时,某些情况下系统可能会强制将其更改为纵向。 - Timmmm
如何强制内置的活动(例如系统图像选择库)仅以横向或纵向模式显示? - LiangWang

124

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

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

ActivityInfo的其他值可以让你将其设置回传感器驱动或锁定纵向。个人而言,我喜欢将其设置为清单中建议的内容,然后在Android SDK中使用上述调用进行更改(如果需要)。


@Yegor 不总是这样。根据Android文档:如果活动当前在前台或以其他方式影响屏幕方向,则屏幕将立即更改(可能导致活动重新启动) - Chaitanya

44

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

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2
其他答案中的清单方法似乎不起作用,但是@anwarma的方法起作用了。 - Anup
这与Haseman的答案有何不同? ;) - kaiya

33

您可以在清单文件中指定活动的方向。请参见此处

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

29
在清单文件中:
<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或更高版本,则还应声明“屏幕大小”。 - Mina Fawzy

9
一个快速简单的解决方案是在AndroidManifest.xml文件中为每个想要强制横屏模式的Activity添加以下内容:
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" />

请注意,这里保留了HTML标签。


我不是问问题的人,但也许他想要编程实现强制,在特定时间强制执行任务? - Hamzah Malik

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