【发布时间】:2011-01-10 03:41:12
【问题描述】:
我在 HTC G1 上使用 Android VNC 查看器。但由于某种原因,尽管我的 G1 处于纵向模式,但该应用程序始终处于横向模式。由于 Android VNC 查看器是开源的,我想知道如何将活动硬编码为“风景”。我想改变它以尊重手机方向。
【问题讨论】:
标签: android landscape android-orientation
我在 HTC G1 上使用 Android VNC 查看器。但由于某种原因,尽管我的 G1 处于纵向模式,但该应用程序始终处于横向模式。由于 Android VNC 查看器是开源的,我想知道如何将活动硬编码为“风景”。我想改变它以尊重手机方向。
【问题讨论】:
标签: android landscape android-orientation
查看 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 的外观,具体取决于布局的创建方式。你将不得不考虑这一点。此外,根据活动的编码方式,您可能会注意到,当屏幕方向发生变化时,填充到任何输入框中的值都会消失。这也可能需要处理。
【讨论】:
configChanges 属性?如果没有它,它似乎可以在我的非键盘手机上工作......如果你有screenOrientation="landscape"但省略configChanges,在什么情况下方向会变为纵向?
您也可以在您的 java 代码中设置相同的数据。
myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
ActivityInfo 上的其他值可让您将其设置回传感器驱动或锁定纵向。就个人而言,我喜欢将其设置为 Manifest 中的某个内容,如该问题的另一个答案中所建议的那样,然后如果需要,稍后使用 Android SDK 中的上述调用进行更改。
【讨论】:
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)
在我的OnCreate(Bundle) 中,我通常会执行以下操作:
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
【讨论】:
您可以在清单中指定活动的方向。见here。
<activity android:allowTaskReparenting=["true" | "false"]
...
android:screenOrientation=["unspecified" | "user" | "behind" |
"landscape" | "portrait" |
"sensor" | "nosensor"]
...
"adjustResize", "adjustPan"] >
【讨论】:
在清单中:
<activity android:name=".YourActivity"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize">
在你的活动中:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.your_activity_layout);
【讨论】:
以下是我用来在横向模式下显示所有活动的代码:
<activity android:screenOrientation="landscape"
android:configChanges="orientation|keyboardHidden"
android:name="abcActivty"/>
【讨论】:
AndroidManifest.xml 文件是一个快速简单的解决方案,为您希望强制进入横向模式的每个活动添加以下内容:
android:screenOrientation="landscape"
【讨论】:
这适用于 Xamarin.Android。在 OnCreate() 中
RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape;
【讨论】:
就是这样!!等这个修复好久了。
我有一个关于双启动需要(以编程方式)横向模式的活动的旧 Android 问题:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
现在 Android 会在启动时设置横向模式。
【讨论】:
阿尔斯兰,
为什么要以编程方式强制定向,尽管清单中已经有一种方法
<activity android:name=".youractivityName" android:screenOrientation="portrait" />
【讨论】:
您需要在每个活动中输入
横向
android:screenOrientation="landscape"
tools:ignore="LockedOrientationActivity"
肖像
android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"
<?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>
【讨论】:
在代码中执行此操作是 IMO 错误的,如果您将其放入 onCreate.在清单中执行此操作,“系统”从应用程序启动时就知道方向。这种类型的元或顶级“指导”应该在清单中。如果您想向自己证明这一点,请在 Activity 的 onCreate 中设置一个中断。如果您在代码中执行此操作,它将被调用两次:它以纵向模式启动,然后切换到横向模式。如果您在清单中执行此操作,则不会发生这种情况。
【讨论】:
对于Android 4.0(冰淇淋三明治)及更高版本,除了landscape 值之外,我还需要添加这些。
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
仅使用keyboardHidden|orientation 仍会导致内存泄漏,并在按下电源按钮时重新创建我的活动。
【讨论】:
orientation|screensize 是不够的。它会自动旋转回纵向。
在像这样调用 setLayout 方法之前,在 onCreate 方法中使用 ActivityInfo (android.content.pm.ActivityInfo)
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
【讨论】:
仅使用
安卓:screenOrientation="人像"
工具:ignore="LockedOrientationActivity"
【讨论】:
按CTRL+F11 旋转屏幕。
【讨论】: