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


Answers:


1631

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

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

编辑:由于这已成为一个非常受欢迎的答案,我感到非常内as,因为强行肖像很少能解决其经常遇到的问题。
强制肖像的主要警告:

  • 这不会使您不必考虑活动生命周期事件或正确保存/恢复状态。除了应用程序轮换之外,还有很多其他事情可以触发活动破坏/重新创建,包括不可避免的事情,例如多任务处理。没有捷径可走。学习使用捆绑和retainInstance碎片。
  • 请记住,与相当统一的iPhone体验不同,在某些设备中,肖像不是很受欢迎的方向。当用户使用带有硬件键盘或游戏垫的设备(例如Nvidia Shield),Chromebook可折叠设备Samsung DeX时,强加肖像可能会限制您的应用程序体验,或给用户带来巨大的使用麻烦。如果您的应用程序没有强大的UX论据,而这会导致在支持其他方向时产生负面体验,则您可能不应该强制使用横向模式。我在谈论诸如“这是一种总是在固定硬件底座中使用的特定型号平板电脑的收银机应用程序”之类的东西。

因此,大多数应用程序应仅让电话传感器,软件和物理配置自行决定用户如何与您的应用程序进行交互。但是,如果您对用例中的默​​认sensor定向行为不满意,可能仍然需要考虑以下几种情况:

  • 如果您主要担心意外的方向改变,而您认为设备的传感器和软件不能很好地应对中间活动(例如,在基于倾斜的游戏中),请考虑支持横向和纵向,而将其nosensor用于方向。这会在大多数平板电脑上强制使用横向模式,而在大多数手机上强制使用纵向模式,但是我仍然不建议在大多数“普通”应用程序中使用此功能(某些用户只是喜欢在手机上输入横向软键盘,而许多平板电脑用户会纵向阅读-并且您应该让他们)。
  • 如果您出于某些原因需要强制肖像,sensorPortrait可能会比portraitAndroid 2.3+ 更好;这允许倒置人像,这在平板电脑使用中非常普遍。

54
可以对整个应用程序执行此操作。

1
我注意到还有另一幅肖像:sensorPortait。sensorPortait和Portrait之间有什么区别?
Jacky

1
如果您阅读Google的文档:“纵向,但根据设备传感器可以是纵向或反纵向。已在API级别9中添加。” 所以-即-“肖像,右上方或上下,仅限Android 2.3以上版本”。
Yoni Samlan

2
正如我在下面的回答中指出的那样-为了解决几个问题,“ nosensor”可能是一个更好的选择。
Mike Weir 2013年

1
我不得不说我不同意。并非所有体验都与手机上的横向模式兼容,因此您应该让UX来决定,而不是传感器。不过,在平板电脑上并非如此。
伦佐·蒂索尼

110

AndroidManifest.xml在阅读这篇文章之前,我不知道文件切换,所以在我的应用程序中,我改用了这个:

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

9
如果设备未处于指定的方向,则这会使您的活动在首次加载时跳跃。
Dori

我正在使用此方法,在OnCreate中调用了它,然后从一些资产文件中读取了数据。如果我使用横向设备启动应用程序,它将旋转,但这会由于一些奇怪的原因而导致错误地读取那些初始化资产(也许应该等待旋转完成一些操作)。使用xml替代方法不会导致此问题。
Radu Simionescu 2014年

1
这可能与Android程序的启动顺序有关。您可以尝试将setRequestedOrientation()移到onResume()???
Rich

45

将其添加android:screenOrientation="portrait"到清单文件中,在其中声明这样的活动

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

如果要使用Java代码尝试

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

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

希望这个帮助对所有人都容易理解...


29

建议"portrait"您在AndroidManifest.xml文件中使用许多答案。这似乎是一个不错的解决方案-但正如文档中所述,您正在挑选出只有风景的设备。您还将迫使某些设备(在横向情况下最有效)进入纵向,而无法获得正确的方向。

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


由于许多人对此表示赞成,因此我想指出,此后我还提出了其他建议,即“肖像”,因为某些晦涩的设备实际上在想要实现应用内屏幕旋转时确实做出了不可预测的响应,以后对我的要求。我还怀疑任何带有“人像”的应用都会被任何Google Play设置阻止。
Mike Weir

实际上,Google Play确实会过滤掉仅横向设备上的仅纵向应用程序,请参阅此页面上的注释:developer.android.com/guide/topics/manifest/…(“您声明的值可通过Google等服务进行过滤播放”)
miracle2k

14

只需在清单中添加“喜欢此行”

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>   

13

如果您需要用户设置,

那我建议 setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

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

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


9

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

首先,要确保您的项目中包含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);
            }
            ....
        });
    }
}


7

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



6

如果您不想在每个活动的清单条目中更好地添加方向的麻烦,请创建一个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......
}

5

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


5

如果您要禁用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);

希望对您有所帮助。有关更多详细信息,请访问此处,在此处输入链接说明


2
由于这么多答案给出的建议与@Phoenix和@Yoni的好的建议相矛盾,我认为一个好的底线是重申他们的建议:android:screenOrientation="nosensor">
DSlomer64

1
@ DSlomer64是。如果您要使用平板电脑设备,则应使用nosensor值代替纵向
IntelliJ Amiya

5

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

代替锁定整个活动的方向,您可以使用此类从实用的角度动态锁定任何视图的方向:-

使您的风景

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

}

4

采用

android:configChanges="keyboardHidden|orientation"
android:screenOrientation="portrait" 

4

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

<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>

4

在oncreate()方法中添加类

 setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

4

如果您使用Xamarin C#,则其中某些解决方案将无法使用。这是我发现可以使用的解决方案。

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

与其他解决方案类似,该类上方的效果很好,并且也不适用于全局,因此需要将其放置在每个活动标题中。


4

您可以通过在manifest.xml中编写特定的活动,使其始终保持纵向模式

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

您还可以通过在活动的onCreate()方法中编写以下行来强制您的活动保持在postrait模式下

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

}

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

3

添加以下对您的项目的表彰,

npm安装

npm我反应本机定向锁

然后您使用清单类,如 React_Native(您的项目文件夹)/ android / app / src / main / AndroidManifest.xml

<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>

谢谢!


2

<apphome>/platform/android创建的目录中AndroidManifest.xml(从生成的目录中复制)。然后将android:screenOrientation=portrait” 添加到所有活动元素。


2
 <?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将活动限制为纵向或横向模式。

如果我们的程序中有多个活动,那么您可以自由地以任何一种方式限制任何一种活动,而它永远不会影响您不需要的其他活动。


2

清单类中的任何一个。

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

或以编程方式

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

注意: 您应该在setContentView中的活动之前调用此方法onCreate()


2

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

例如 :

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

1

为了希望对其他人有所帮助,您仅需要AndroidManifest.xml中ACTIVITY上的以下属性:

android:configChanges =“ orientation”

因此,完整活动节点:

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

还有这么多答案,您应该提供更多信息,为什么要使用您的信息。尤其是文档说的是不使用此选项:“注意:应避免使用此属性,并且只能将其用作最后的选择。请阅读处理运行时更改以获取有关如何正确处理由于配置更改而导致的重新启动的更多信息。” developer.android.com/guide/topics/manifest/...
Murmel

1

在Kotlin中,可以使用以下方法以编程方式实现

requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

1

它对我有用,请尝试在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>

我将是一个很好的解决方案,因为您不必为每个活动进行设置。不幸的是,在我的应用程序中不起作用。
Myroslav Kolodii

1

将其放入清单。

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

方向将为纵向,但如果用户的手机倒置,则它也将显示正确的方式。(因此您的屏幕将旋转180度)。


如果活动以多窗口模式运行,那么系统将忽略此属性 。


0

如果您的活动与第一个设备方向状态有关,请在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);
        }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.