提问



如何在Android应用中为某些视图禁用横向模式?

最佳参考


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


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


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

强迫肖像的主要警告:



  • 这并不能免除你不得不考虑Activity
    生命周期事件或正确保存/恢复状态。有很多
    除了app旋转之外可以触发Activity的东西
    破坏/娱乐,包括不可避免的事情,如多任务处理。没有捷径;学习使用bundle和retainInstance片段。

  • 请记住,与相当统一的iPhone体验不同,有许多设备,其中肖像不是明显流行的方向。当用户使用带有硬件键盘或游戏手柄的设备时,可以使用Droid 1-4,Xperia Play或Nvidia Shield,强制使用肖像可以使您的应用程序成为一个巨大的可用性麻烦(特别是在Shield上)。如果你的应用程序没有一个非常具体的用例会导致支持其他方向的直接负面体验,你可能不应该强迫横向。我正在谈论的事情,这是一个电话的远程控制应用程序在设备的一侧只有一个IR发射器,或这是一个收银机应用程序,用于固定硬件基座中常用的一种特定型号的平板电脑。



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



  • 如果您的主要关注点是意外方向改变,您认为设备的传感器和软件无法很好地应对(例如,在基于倾斜的游戏中),请考虑支持横向和纵向,但使用[[nosensor为方向。在大多数手机上,大多数平板电脑和人像都有这种风景,但我仍然不会推荐大多数普通应用程序(有些用户喜欢在手机上输入横向软键盘,许多平板电脑用户都是纵向阅读 - 以及你应该让他们)。

  • 如果仍因某种原因需要强制使用肖像,sensorPortrait可能优于portrait for Android 2.3+;这允许颠倒的肖像,这在平板电脑使用中非常普遍。


其它参考1


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


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

其它参考2


在您的清单文件中添加此android:screenOrientation="portrait",您可以在此声明您的Activity


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


如果你想用java代码试试


setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 


onCreate()中为您的Activity调用setContentView方法之前。


希望这对所有人都有帮助并且易于理解......

其它参考3


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


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

其它参考4


如果你想要用户设置,


然后我推荐setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


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


我需要这个,因为我的计时器必须对应屏幕上的内容,旋转屏幕会破坏当前的Activity。

其它参考5


只需在你的清单中添加Like this Line



  机器人:screenOrientation=画像



<manifest
    package="com.example.speedtestmeter"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <activity
            android:name="MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

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

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

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

    </application>

</manifest>   

其它参考6


在Activity的onCreate()中使用它


setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

其它参考7


只需在您的Activity代码中添加此属性即可。


 android:screenOrientation="portrait"

其它参考8


你应该在AndroidManifest.xml中更改android:screenOrientation="sensorPortait"

其它参考9


如果您不想更好地完成在每个清单条目中添加方向的麻烦,请创建一个BaseActivity类(继承Activity或AppCompatActivity),它将由应用程序的每个Activity继承而不是Activity 或AppCompatActivity,只需在BaseActivity中添加以下代码:


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    // rest of your code......
}

其它参考10


在您的清单文件中添加以下代码段。


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


这仅支持肖像模式

其它参考11


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

其它参考12


如果您要禁用 Landscape mode for your android app (或单个Activity),您需要做的就是添加,


android:screenOrientation="portrait" AndroidManifest.xml 文件中的Activity代码。


喜欢:


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


另一种方式,程序化方法。


如果你想以编程方式这样做,即。使用Java代码。您可以通过在不希望以横向模式显示的Activity的Java类中添加以下代码来实现此目的。


setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


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

其它参考13


使用


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

其它参考14


您必须设置每个Activity的方向。


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

其它参考15


在oncreate()方法中添加类


 setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

其它参考16


如果您使用 Xamarin C#,其中一些解决方案将无效。这是我发现的解决方案。


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


类上面的类似于其他解决方案,也不是全局适用的,需要放在每个Activity标题中。

其它参考17


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


您可以使用此类以实际方式动态锁定任何视图的方向,而不是锁定整个Activity的方向: -


让您的视图 风景


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

}

其它参考18


只需添加
机器人:screenOrientation=画像
到应用程序清单中的activity标记。


例如:


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

其它参考19


你应该把这段代码放在清单文件中.......


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

其它参考20


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

其它参考21


您可以通过在manifest.xml中写入此操作来强制您的特定Activity始终保持纵向模式


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


您还可以通过在Activity的onCreate()方法中写下以下行来强制您的Activity保持在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);

}

其它参考22


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

其它参考23


在AndroidManifest.xml文件中添加android:screenOrientation =portrait。example <activity android:name=".MapScreen" android:screenOrientation="portrait"></activity>

其它参考24


您可以为整个应用程序执行此操作,而无需使所有Activity扩展为公共基类。


首先要确保在项目中包含Application子类。在您的应用首次启动时调用的onCreate()中,您注册了一个ActivityLifecycleCallbacks对象(API级别14+)以接收Activity生命周期事件的通知。


这使您有机会在应用程序中的任何Activity启动(或停止,恢复或其他)时执行您自己的代码。此时,您可以在新创建的Activity上调用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);

        }

        ....

    });

}


}

其它参考25


为了帮助其他人,AndroidManifest.xml中的ACTIVITY的以下属性就是您所需要的:


机器人:configChanges=方向


所以,完整的Activity节点:


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

其它参考26


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

其它参考27


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


requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

其它参考28


 <?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限制纵向或横向模式下的Activity。


如果我的程序中有多个Activity,那么您可以自由地限制任何一个模式中的任何一个Activity,它永远不会影响您不想要的其他Activity。

其它参考29


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