2010-01-27 85 views
118

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

回答

28

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

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

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

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

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

+9

尽管这有效,但它强制重新启动活动。 – Yegor 2014-01-01 15:21:25

166

望着AndroidManifest.xml中(link),第9行:

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

该行指定screenOrientation景观,但笔者更进一步在覆盖所有屏幕方向与configChanges="orientation|keyboardHidden"变化。这指向VncCanvasActivity.java中的重载函数。

如果你看一下VncCanvasActivity,上线109是overrided功能:

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

笔者专门整理注释忽略任何键盘或方向的变化。


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

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

这应该改变计划,从纵向切换到当用户旋转设备时风景。

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

+2

为什么需要'configChanges'属性?它似乎在没有它的非键盘手机上工作......如果你有'screenOrientation =“landscape”'但省略了'configChanges',那么在什么情况下方向会改变为肖像? – Timmmm 2012-01-15 20:52:06

+0

在新版本中,您还应该指定screenSize:['如果您的应用程序的目标API级别为13或更高(由minSdkVersion和targetSdkVersion属性声明),则还应该声明“screenSize”配置,因为它也会在设备在纵向和横向之间切换。'](http://developer.android.com/guide/topics/manifest/activity-element.html) – Cel 2012-03-21 10:39:17

+0

如何强制执行内置活动,如系统图像选择库仅适用于横向格式或只有肖像? – Jacky 2015-04-23 01:54:30

3

阿尔斯兰, 你为什么要强迫方向亲语法,虽然有已经在清单 <activity android:name=".youractivityName" android:screenOrientation="portrait" />

+0

我不是提问者,但也许他想以编程方式强制执行,因为他想在某个时间强制执行它? – 2014-05-30 18:03:55

8

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

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

“orientation”如果您的应用程序的目标是API级别13或更高,那么您还应该声明“screenSize” – 2015-09-10 07:51:44

33

在我OnCreate(Bundle),我一般做到以下几点:

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
+0

谢谢..你在当天 – 2013-12-16 11:48:23

+0

明显的方法在其他答案似乎并没有工作,但@anwarma你做了 – Anup 2015-08-19 12:29:34

4

就是这样!长期等待这个修复。

我有关于双启动所需的(程序)横向模式的活动的旧的Android问题:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

现在的Android就开始横向模式。

-23

CTRL+F11旋转屏幕。

+3

他们现在想如何设置应用程序的默认方向,而不是如何旋转屏幕。 – 2013-12-01 20:38:02

+0

模拟器的CTRL + f12。 – Lazy 2015-07-27 12:42:09

0

对于Android 4.0(冰淇淋三明治)和后来,我需要添加这些,除了landscape价值。

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

只使用keyboardHidden|orientation仍然会导致内存泄漏和我的活动的游艺按下电源按钮时。

+0

坏习惯警报!这与强制横向模式下的活动无关。你总是需要实现你的活动状态的存储和重新创建。这是基本的Android开发知识。不要用这个hacky修复来解决这个问题。如果系统需要更多内存,活动可以被系统关闭。 – Roel 2017-06-19 15:36:21

+0

@Roel,它是防止活动在例如旋转设备时旋转回肖像的唯一方法。它可以防止这些配置更改影响活动。 – Peterdk 2017-06-19 19:34:45

+0

对不起有点脾气暴躁的消息,但我测试了它,我没有为横向模式的所有这些值。当你添加所有这些值时,它意味着你在onConfigurationChanged()中自己处理更改,而不是仅仅重新启动活动(并且必须实现该功能!),但是如果强制使用landschape,则不会发生轮换。 – Roel 2017-06-20 08:05:29

1

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

+0

我不同意。在代码中执行任何操作都是我首选的方法。基于单一职责原则,清单应该只关注应用程序级属性,权限和API绑定。我实际上不同意在应用程序清单中存在的标记,所以我从来没有把它放在那里(并且它工作正常)。一个活动如何呈现显然是一个关注的问题。您的活动应该独立负责呈现方式,所以我通常会将所有表示逻辑放在视图/活动代码中。 – ComeIn 2016-08-23 23:14:01

5

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

android:screenOrientation="landscape" 
10

在清单:

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

在你的活动:

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

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

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

谁在谈论Xamarin.Android? – Roel 2017-06-19 15:32:40

+0

@Rel我是。我可以问为什么倒票吗?这个问题没有具体说明它是不是Xamarin,Xamarin开发者可能有类似的问题。 – ComeIn 2017-06-28 06:11:15

0

使用ActivityInfo(android.content.pm.ActivityInfo)在onCreate方法调用setLayout的方法,这样

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)之前;

相关问题