如何为我的 Android 应用程序中的某些视图禁用横向模式?
31 回答
添加android:screenOrientation="portrait"
到 AndroidManifest.xml 中的活动。例如:
<activity android:name=".SomeActivity"
android:label="@string/app_name"
android:screenOrientation="portrait" />
由于这已成为一个超级流行的答案,我感到非常内疚,因为强制肖像很少是解决它经常应用的问题的正确解决方案。
强制肖像的主要注意事项:
- 这并不能免除您必须考虑活动生命周期事件或正确保存/恢复状态的责任。除了应用程序轮换之外,还有很多事情可以触发活动破坏/重新创建,包括不可避免的事情,例如多任务处理。没有捷径;学习使用包和
retainInstance
片段。 - 请记住,与相当统一的 iPhone 体验不同,有些设备的纵向并不是明显流行的方向。当用户使用带有硬件键盘或游戏手柄的设备(例如 Nvidia Shield、Chromebook、可折叠设备或Samsung DeX)时,强制人像可能会使您的应用体验受到限制或极大的可用性麻烦。如果您的应用程序没有强大的 UX 参数会导致支持其他方向的负面体验,那么您可能不应该强制横向。我说的是“这是一款收银机应用程序,适用于始终用于固定硬件底座的特定型号平板电脑”。
因此,大多数应用程序应该让手机传感器、软件和物理配置自行决定用户希望如何与您的应用程序交互。但是,如果您对用例中的默认方向行为不满意,您可能仍需要考虑一些sensor
情况:
- 如果您主要担心的是在您认为设备的传感器和软件无法很好应对的活动过程中意外的方向变化(例如,在基于倾斜的游戏中),请考虑支持横向和纵向,但使用
nosensor
用于方向。这会强制大多数平板电脑上的横向和大多数手机上的纵向,但我仍然不建议对大多数“普通”应用程序这样做(一些用户只是喜欢在手机上输入横向软键盘,而许多平板电脑用户以纵向阅读 - 和你应该让他们)。 - 如果由于某种原因仍然需要强制人像,
sensorPortrait
可能比portrait
Android 2.3 (Gingerbread) 及更高版本更好;这允许倒置的肖像,这在平板电脑使用中很常见。
在阅读这篇文章之前,我不知道AndroidManifest.xml
文件切换,所以在我的应用程序中我使用了这个:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // Fixed portrait orientation
android:screenOrientation="portrait"
在您声明活动的清单文件中添加。像这样:
<activity
android:name=".yourActivity"
....
android:screenOrientation="portrait" />
如果您想使用 Java 代码执行此操作,请尝试:
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
在为您的活动调用setContentView
方法之前onCreate()
。
这里的很多答案都建议"portrait"
在您的 AndroidManifest.xml 文件中使用。这似乎是一个很好的解决方案 - 但如文档中所述,您正在挑选可能只有景观的设备。您还强制某些设备(在横向上效果最好)进入纵向,而不是获得正确的方向。
我的建议是"nosensor"
改用。这将使设备使用其默认的首选方向,不会阻止 Google Play 上的任何购买/下载,并确保传感器不会弄乱您的(在我的情况下为 NDK)游戏。
只需在您的清单中添加这一行:
android:screenOrientation="portrait"
像:
<manifest
package="com.example.speedtest"
android:versionCode="1"
android:versionName="1.0" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="ComparisionActivity"
android:label="@string/app_name"
android:screenOrientation="portrait" >
</activity>
</application>
</manifest>
如果您想要用户设置,那么我建议您setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
您可以从设置菜单更改设置。
我需要这个,因为我的计时器必须与屏幕上的内容相对应,旋转屏幕会破坏当前的活动。
如果您想禁用Landscape mode for your Android app
(或单个活动),您需要做的就是添加:
android:screenOrientation="portrait"
到AndroidManifest.xml
文件中的活动标签。
像:
<activity
android:name="YourActivityName"
android:icon="@drawable/ic_launcher"
android:label="Your App Name"
android:screenOrientation="portrait">
另一种方式:程序化方法。
如果您想以编程方式执行此操作,即使用 Java 代码。您可以通过在您不希望以横向模式显示的活动的 Java 类中添加以下代码来实现。
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
您可以对整个应用程序执行此操作,而不必让所有活动都扩展一个公共基类。
诀窍是首先确保在项目中包含一个 Application 子类。在您的应用程序首次启动时调用的 onCreate() 中,您注册一个 ActivityLifecycleCallbacks 对象(API 级别 14+)以接收活动生命周期事件的通知。
这使您有机会在应用程序中的任何活动开始(或停止,或恢复,或其他)时执行自己的代码。此时,您可以对新创建的活动调用 setRequestedOrientation()。
并且不要忘记在清单文件中添加 app:name=".MyApp"。
class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
// register to be informed of activities starting up
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity,
Bundle savedInstanceState) {
// new activity created; force its orientation to portrait
activity.setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
....
});
}
}
您应该更改android:screenOrientation="sensorPortrait"
AndroidManifest.xml
在 Activity 的 onCreate() 中使用它
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
只需在您的活动标签中添加此属性即可。
android:screenOrientation="portrait"
添加android:screenOrientation="portrait"
到要禁用横向模式的活动。
如果您不想更好地在活动的每个清单条目中添加方向的麻烦,请创建一个 BaseActivity 类(继承“Activity”或“AppCompatActivity”),它将被应用程序的每个活动而不是“Activity”继承' 或 'AppCompatActivity' 并在您的 BaseActivity 中添加以下代码:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
// rest of your code......
}
如何在某些视图中更改方向
除了锁定整个活动的方向,您可以使用此类从任何视图中动态地锁定方向,实用:
让你的视野风景
OrientationUtils.lockOrientationLandscape(mActivity);
使您的视图纵向
OrientationUtils.lockOrientationPortrait(mActivity);
解锁方向
OrientationUtils.unlockOrientation(mActivity);
方向实用程序类
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Build;
import android.view.Surface;
import android.view.WindowManager;
/* * This class is used to lock orientation of android app in nay android devices
*/
public class OrientationUtils {
private OrientationUtils() {
}
/** Locks the device window in landscape mode. */
public static void lockOrientationLandscape(Activity activity) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
/** Locks the device window in portrait mode. */
public static void lockOrientationPortrait(Activity activity) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
/** Locks the device window in actual screen mode. */
public static void lockOrientation(Activity activity) {
final int orientation = activity.getResources().getConfiguration().orientation;
final int rotation = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()
.getRotation();
// Copied from Android docs, since we don't have these values in Froyo
// 2.2
int SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8;
int SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9;
// Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO
if (!(Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO)) {
SCREEN_ORIENTATION_REVERSE_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
SCREEN_ORIENTATION_REVERSE_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}
if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90) {
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
} else if (rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270) {
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_PORTRAIT);
} else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
}
}
}
/** Unlocks the device window in user defined screen mode. */
public static void unlockOrientation(Activity activity) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
}
}
采用:
android:configChanges="keyboardHidden|orientation"
android:screenOrientation="portrait"
您必须设置每个活动的方向。
<activity
android:name="com.example.SplashScreen2"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Black.NoTitleBar" >
</activity>
<activity
android:name="com.example.Registration"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Black.NoTitleBar" >
</activity>
<activity
android:name="com.example.Verification"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Black.NoTitleBar" >
</activity>
<activity
android:name="com.example.WelcomeAlmostDone"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Black.NoTitleBar" >
</activity>
<activity
android:name="com.example.PasswordRegistration"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Black.NoTitleBar" >
</activity>
如果您使用的是Xamarin C#,其中一些解决方案将不起作用。这是我发现可行的解决方案。
[Activity(MainLauncher = true, Icon = "@drawable/icon", ScreenOrientation = ScreenOrientation.Portrait)]
上面的类运行良好,类似于其他解决方案。此外,它不是全局适用的,需要放在每个活动标题中。
在 oncreate() 方法中添加一个类:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
您可以通过在manifest.xml文件中写入以下内容来强制您的特定活动始终保持纵向模式:
<activity
android:name=".MainActivity"
android:screenOrientation="portrait"></activity>
您还可以通过在活动的 onCreate() 方法中编写以下行来强制活动保持纵向模式:
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
把它放到你的清单中。
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="sensorPortrait" />
方向将是纵向的,但如果用户的手机是倒置的,它也会显示正确的方向。(所以你的屏幕会旋转 180 度。)
如果活动在多窗口模式下运行,系统将忽略此属性。
更多:https ://developer.android.com/guide/topics/manifest/activity-element
<android . . . >
. . .
<manifest . . . >
. . .
<application>
<activity
android:name=".MyActivity"
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation">
</activity>
</application>
</manifest>
</android>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="in.co.nurture.bajajfinserv">
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<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="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
我们可以通过使用属性 或 将 Activity 限制为纵向或横向模式android:screenOrientation
。
如果我们的程序中有多个活动,那么我们可以自由地以任何一种模式限制任何一项活动,并且它永远不会影响您不想要的其他活动。
在清单类中:
<activity android:name=".yourActivity"
....
android:screenOrientation="portrait" />
或以编程方式:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
注意:setContentView
你应该为你的活动调用这个 before方法onCreate()
。
将以下命令添加到您的项目中,
npm install
npm i react-native-orientation-locker
然后你使用像 React_Native (Your Project Folder)/android/app/src/main/AndroidManifest.xml 这样的清单类:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.payroll_react">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<application
android:name=".MainApplication"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:allowBackup="false"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>
</manifest>
在<apphome>/platform/android
目录中,创建AndroidManifest.xml
(从生成的目录中复制它)。
然后添加android:screenOrientation="portrait"
到所有活动元素。
添加AndroidManifest.xml文件android:screenOrientation="portrait"
。
例如:
<activity
android:name=".MapScreen"
android:screenOrientation="portrait"></activity>
它对我有用。尝试在 AndroidManifest 文件中添加此代码:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:screenOrientation="portrait"
android:theme="@style/AppTheme">
....
....
</application>
AndroidManifest.xml中Activity的以下属性就是您所需要的:
android:configChanges="orientation"
所以,完整的活动节点:
<activity
android:name="Activity1"
android:icon="@drawable/icon"
android:label="App Name"
android:configChanges="orientation">
在Kotlin中,同样可以使用以下代码以编程方式实现:
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
如果您的活动与第一个设备方向状态相关,请在onCreate
方法中获取当前设备方向,然后永久修复它:
int deviceRotation = ((WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();
if(deviceRotation == Surface.ROTATION_0) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
else if(deviceRotation == Surface.ROTATION_180)
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
}
else if(deviceRotation == Surface.ROTATION_90)
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
else if(deviceRotation == Surface.ROTATION_270)
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
}
添加android:screenOrientation="portrait"
您的清单。如果您想为特定活动应用模式,请在所需的活动标签中定义它。或者在整个应用程序的应用程序标签中定义。像:
<application
<!-- ... -->
android:screenOrientation="portrait"
</application>