如何在Android中禁用横向模式?

如何在我的Android应用程序中禁用某些视图的横向模式?

676001 次浏览

android:screenOrientation="portrait"添加到AndroidManifest.xml.中的活动例如:

<activity android:name=".SomeActivity"android:label="@string/app_name"android:screenOrientation="portrait" />

由于这已经成为一个超级流行的答案,我感到非常内疚,因为强迫肖像很少是解决它经常应用的问题的正确解决方案。强制肖像的主要警告:

  • 这并不能免除你必须考虑活动生命周期事件或正确保存/恢复状态。有很多除了应用程序旋转之外可以触发活动的东西破坏/娱乐,包括不可避免的事情,如多任务处理。没有捷径;学会使用捆绑包和retainInstance碎片。
  • 请记住,与相当统一的iPhone体验不同,在某些设备上,纵向并不是明显受欢迎的方向。当用户在带有硬件键盘或游戏垫的设备上时,比如Nvidia Shield,在chromebook上,在可折叠上,或者在三星DeX上,强制纵向可以使你的应用体验受到限制或者成为巨大的可用性麻烦。如果你的应用没有强大的用户体验论据,导致支持其他方向的负面体验,你可能不应该强制横向。我说的是“这是一个收银机应用程序,用于一种特定型号的平板电脑,总是在固定的硬件底座中使用。”

因此,大多数应用程序应该让手机传感器、软件和物理配置自己决定用户希望如何与你的应用程序交互。但是,如果你对用例中sensor方向的默认行为不满意,你可能仍然需要考虑一些情况:

  • 如果你主要担心的是在活动中意外改变方向,你认为设备的传感器和软件无法很好地应对(例如,在基于倾斜的游戏中),考虑支持横向和纵向,但使用nosensor作为方向。这在大多数平板电脑上强制使用横向,在大多数手机上强制使用纵向,但我仍然不推荐大多数“正常”应用程序(一些用户只是喜欢在手机上输入横向软键盘,许多平板电脑用户以纵向阅读-你应该让他们这样做)。
  • 如果你的仍然出于某种原因需要强制肖像,sensorPortrait可能比android2.3(姜饼)和更高版本的portrait更好;这允许倒置肖像,这在平板电脑使用中很常见。

直到阅读这篇文章,我才意识到AndroidManifest.xml文件开关,所以在我的应用程序中,我使用了这个:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // Fixed portrait orientation

<apphome>/platform/android目录中,创建AndroidManifest.xml(从生成的目录复制它)。

然后将android:screenOrientation="portrait"添加到活动元素的所有

AndroidManifest.xml文件中添加android:screenOrientation="portrait"

例如:

<activityandroid:name=".MapScreen"android:screenOrientation="portrait"></activity>

如果你想要用户设置,那么我推荐setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

您可以从设置菜单更改设置。

我要求这样做是因为我的计时器必须与屏幕上的内容相对应,并且旋转屏幕会破坏当前的活动。

用途:

android:configChanges="keyboardHidden|orientation"android:screenOrientation="portrait"
<android . . . >. . .<manifest . . . >. . .<application><activityandroid:name=".MyActivity"android:screenOrientation="portrait"android:configChanges="keyboardHidden|orientation"></activity></application></manifest></android>

在您声明活动的清单文件中添加android:screenOrientation="portrait"。像这样:

<activityandroid:name=".yourActivity"....android:screenOrientation="portrait" />

如果您想使用Java代码执行此操作,请尝试:

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

在为onCreate()中的活动调用setContentView方法之前。

AndroidManifest.xml活动上的以下属性就是您需要的全部:

android:configChanges="orientation"

所以,完整的活动节点:

<activityandroid:name="Activity1"android:icon="@drawable/icon"android:label="App Name"android:configChanges="orientation">

这里的很多答案都建议在您的AndroidManifest.xml文件中使用"portrait"。这似乎是一个很好的解决方案-但正如留档中所述,您正在挑选可能只有横向的设备。您还强迫某些设备(在横向中效果最好)进入纵向,而不是获得正确的方向。

我的建议是使用"nosensor"代替。这将使设备使用其默认的首选方向,不会阻止在Google Play上的任何购买/下载,并将确保传感器不会弄乱您的(在我的情况下是NDK)游戏。

只需在您的活动标签中添加此属性。

 android:screenOrientation="portrait"

您应该在AndroidManifest.xml中更改android:screenOrientation="sensorPortrait"

android:screenOrientation="portrait"添加到要禁用横向模式的活动中。

您必须设置每个活动的方向。

<activityandroid:name="com.example.SplashScreen2"android:label="@string/app_name"android:screenOrientation="portrait"android:theme="@android:style/Theme.Black.NoTitleBar" ></activity><activityandroid:name="com.example.Registration"android:label="@string/app_name"android:screenOrientation="portrait"android:theme="@android:style/Theme.Black.NoTitleBar" ></activity><activityandroid:name="com.example.Verification"android:label="@string/app_name"android:screenOrientation="portrait"android:theme="@android:style/Theme.Black.NoTitleBar" ></activity><activityandroid:name="com.example.WelcomeAlmostDone"android:label="@string/app_name"android:screenOrientation="portrait"android:theme="@android:style/Theme.Black.NoTitleBar" ></activity><activityandroid:name="com.example.PasswordRegistration"android:label="@string/app_name"android:screenOrientation="portrait"android:theme="@android:style/Theme.Black.NoTitleBar" ></activity>

只需在您的清单中添加此行:

android:screenOrientation="portrait"

喜欢:

<manifestpackage="com.example.speedtest"android:versionCode="1"android:versionName="1.0" >
<applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" >
<activityandroid:name="ComparisionActivity"android:label="@string/app_name"android:screenOrientation="portrait" ></activity>
</application>
</manifest>

如果你想禁用#0(或单个活动),你需要做的就是添加:

#0#1文件中的活动标签。

喜欢:

<activityandroid:name="YourActivityName"android:icon="@drawable/ic_launcher"android:label="Your App Name"android:screenOrientation="portrait">

另一种方法:程序化方法。

如果您想以编程方式执行此操作,即使用Java代码。您可以通过在不希望以横向模式显示的活动的Java类中添加以下代码来执行此操作。

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

在活动的onCreate()中使用它

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

在oncreate()方法中添加一个类:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

如果您使用的是Xamarin C#,其中一些解决方案将无法工作。这是我找到的解决方案。

[Activity(MainLauncher = true, Icon = "@drawable/icon", ScreenOrientation = ScreenOrientation.Portrait)]

上面的类效果很好,和其他方案类似。同样,它不是全局适用的,需要放在每个活动头中。

如何在某些视图中改变方向

不需要锁定整个活动的方向,您可以使用这个类动态地锁定来自您的任何视图的方向:

让你的观点 景观

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);
}


}

如果您的活动与第一个设备方向状态相关,那么在 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);
}

您可以通过在 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);
}

如果你不想在每个清单条目中添加方向感更好,创建一个 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......
}

科特林中,同样可以通过编程使用以下方法实现:

requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
<?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>

我们可以通过使用属性或 android:screenOrientation来限制纵向或横向模式下的活动。

如果我们有一个以上的活动在我们的计划,然后我们有自由限制任何一个活动在任何一个的模式,它永远不会影响其他你不想要的活动。

试着在 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>

您可以对整个应用程序执行此操作,而不必让所有活动扩展公共基类。

诀窍是首先确保在项目中包含 Application 子类。在其 onCreate ()中,当您的应用程序第一次启动时调用,您注册一个 ActivityLificycleCallback 对象(API 级别14 +)以接收活动生命周期事件的通知。

这使您有机会在应用程序中的任何活动启动(或停止、恢复或其他)时执行自己的代码。此时,您可以对新创建的活动调用 setRequestedOrient ()。

不要忘记在清单文件中添加 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);
}
....
});
}
}

在清单类中:

<activity android:name=".yourActivity"
....
android:screenOrientation="portrait" />

或者程序化地:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

注意: 对于 onCreate()中的活动,应该在 setContentView方法之前调用这个函数。

将以下命令添加到项目中,

npm install


npm i react-native-orientation-locker

然后使用清单类,如, 反应 _ 本机(您的项目文件夹)/ 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>

把它列入你的旅客名单。

<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="sensorPortrait" />

方向将是肖像,但如果用户的手机是上下颠倒,它显示正确的方式以及。(所以你的屏幕会旋转180度。)


如果活动在 多窗口模式多窗口模式中运行,则系统 无视 this 属性。

更多: https://developer.android.com/guide/topics/manifest/activity-element

在清单中添加 android:screenOrientation="portrait"。如果您希望为特定的活动应用模式,请在所需的活动标记中定义此模式。或者在 申请标签中为整个应用程序定义。比如:

<application
<!-- ... -->
android:screenOrientation="portrait"
</application>