我在HTC G1上使用 Android VNC查看器。但是由于某种原因,尽管我的 G1 处于纵向模式,但该应用程序始终处于横向模式。由于 Android VNC 查看器是开源的,我想知道如何将活动硬编码为“风景”。我想改变它以尊重手机方向。
16 回答
查看第 9 行的 AndroidManifest.xml(链接):
<activity android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden" android:name="VncCanvasActivity">
此行指定screenOrientation
as 横向,但作者更进一步用 覆盖任何屏幕方向更改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 的外观,具体取决于布局的创建方式。你将不得不考虑这一点。此外,根据活动的编码方式,您可能会注意到,当屏幕方向发生变化时,填充到任何输入框中的值都会消失。这也可能需要处理。
您也可以在 java 代码中设置相同的数据。
myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
ActivityInfo 上的其他值将允许您将其设置回传感器驱动或锁定的纵向。就个人而言,我喜欢将其设置为 Manifest 中的某个内容,如该问题的另一个答案中所建议的那样,然后如果需要,稍后使用 Android SDK 中的上述调用对其进行更改。
在我的OnCreate(Bundle)
中,我通常执行以下操作:
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
您可以在清单中指定活动的方向。见这里。
<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 在启动时制作横向模式。
Arslan,您为什么要以编程方式强制定向,尽管清单中已经有一种方法
<activity android:name=".youractivityName" android:screenOrientation="portrait" />
在活动中添加以下行
您需要输入每个活动
景观
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>
在代码中执行此操作是 IMO 错误的,如果将其放入 onCreate 中则更是如此。在清单中执行此操作,“系统”从应用程序启动时就知道方向。这种类型的元或顶级“指导”应该在清单中。如果您想向自己证明这一点,请在 Activity 的 onCreate 中设置一个中断。如果您在代码中执行此操作,它将被调用两次:它以纵向模式启动,然后切换到横向模式。如果您在清单中执行此操作,则不会发生这种情况。
对于Android 4.0landscape
(Ice Cream Sandwich) 及更高版本,除了值之外,我还需要添加这些。
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
按下电源按钮时,仅使用keyboardHidden|orientation
仍会导致内存泄漏和我的活动重新创建。
仅使用
android:screenOrientation="portrait" 工具:ignore="LockedOrientationActivity"
在像这样调用 setLayout 方法之前,在 onCreate 方法中使用 ActivityInfo (android.content.pm.ActivityInfo)
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
按下CTRL+F11
可旋转屏幕。