Disable landscape mode in Android?
如何在我的Android应用中禁用某些视图的横向模式?
将
1 2 3 | <activity android:name=".SomeActivity" android:label="@string/app_name" android:screenOrientation="portrait" /> |
编辑:由于这已成为一个超级流行的答案,我感到非常内疚,因为强迫肖像很少是解决它经常应用的问题的正确方法。
强迫肖像的主要警告:
-
这并不能免除你不得不考虑活动
生命周期事件或正确保存/恢复状态。有很多
除了可以触发活动的app旋转之外的东西
破坏/娱乐,包括不可避免的事情,如多任务处理。没有捷径;学会使用bundle和retainInstance 片段。 - 请记住,与相当统一的iPhone体验不同,有些设备的肖像不是明显流行的方向。当用户使用带有硬件键盘或游戏手柄的设备时,可以使用Nvidia Shield,Chromebook,折叠式设备或Samsung DeX,强制人像会让您的应用体验受到限制或巨大的可用性麻烦。如果您的应用程序没有强大的用户体验参数,这会导致支持其他方向的负面体验,那么您可能不应强制使用横向广告。我说的是"这是一个收银机应用程序,适用于固定硬件底座中常用的一种特定型号的平板电脑。"
因此,大多数应用应该让手机传感器,软件和物理配置自行决定用户如何与您的应用进行互动。但是,如果您对用例中
-
如果您的主要关注点是意外方向改变,您认为设备的传感器和软件无法很好地应对(例如,在基于倾斜的游戏中),请考虑支持横向和纵向,但使用
nosensor 进行定位。大多数手机上的大多数平板电脑和人像都有这种风景,但我仍然不建议大多数"普通"应用程序(有些用户喜欢在手机上键入横向软键盘,许多平板电脑用户都是纵向阅读 - 和你应该让他们)。 -
如果由于某种原因仍然需要强制使用肖像,那么对于Android 2.3+,
sensorPortrait 可能优于portrait ;这允许颠倒的肖像,这在平板电脑使用中非常常见。
在阅读这篇文章之前我不知道
1 | setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // Fixed Portrait orientation |
在清单文件中添加此
1 2 3 | <activity android:name=".yourActivity" .... android:screenOrientation="portrait" /> |
如果你想用java代码试试
1 | setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); |
在
希望这对所有人都有帮助并且易于理解......
这里的很多答案都建议在AndroidManifest.xml文件中使用
我的建议是改用
如果你想要用户设置,
然后我推荐
您可以从设置菜单更改设置。
我需要这个,因为我的计时器必须与屏幕上的内容相对应,旋转屏幕会破坏当前的活动。
只需在你的清单中添加Like this Line
android:screenOrientation="portrait"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <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> <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> |
在Activity的onCreate()中使用它
1 | setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); |
只需在您的活动代码中添加此属性即可。
1 | android:screenOrientation="portrait" |
如果您不想更好地处理在每个清单活动条目中添加方向的麻烦,请创建一个BaseActivity类(继承"Activity"或"AppCompatActivity"),它将由应用程序的每个活动继承而不是"活动" '或'AppCompatActivity',只需在BaseActivity中添加以下代码:
1 2 3 4 5 6 | @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // rest of your code...... } |
您应该在AndroidManifest.xml中更改
在您的清单文件中添加以下代码段。
1 2 3 | <activity android:name=".yourActivity" .... android:screenOrientation="portrait"/> |
这仅支持肖像模式
将
如果要禁用
喜欢:
1 2 3 4 | <activity android:name="YourActivityName" android:icon="@drawable/ic_launcher" android:label="Your App Name" android:screenOrientation="portrait"> |
另一种方式,程序化方法。
如果你想以编程方式这样做,即。使用Java代码。您可以通过在不希望以横向模式显示的活动的Java类中添加以下代码来执行此操作。
1 | setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); |
希望对您有所帮助。有关详细信息,请访问此处,在此处输入链接说明
如何在某些视图中更改方向
您可以使用此类以实际方式动态锁定任何视图的方向,而不是锁定整个活动的方向: -
让你的景观风景
1 | OrientationUtils.lockOrientationLandscape(mActivity); |
让你的肖像
1 | OrientationUtils.lockOrientationPortrait(mActivity); |
解锁方向
1 | OrientationUtils.unlockOrientation(mActivity); |
方向工具类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | 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); } } |
如果您使用的是Xamarin C#,其中一些解决方案将无效。这是我发现的解决方案。
1 | [Activity(MainLauncher = true, Icon ="@drawable/icon", ScreenOrientation = ScreenOrientation.Portrait)] |
在类之上运行良好,与其他解决方案类似,也不是全局适用的,需要放在每个活动标题中。
您可以通过在manifest.xml中写入此操作来强制您的特定活动始终保持纵向模式
1 2 | <activity android:name=".MainActivity" android:screenOrientation="portrait"></activity> |
您还可以通过在活动的onCreate()方法中写下以下行来强制您的活动保持在postrait模式
1 2 3 4 5 6 7 8 | @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标记。
例如:
1 2 | <activity android:name=".ui.activities.MainActivity" android:screenOrientation="portrait"></activity> |
你应该把这段代码放在清单文件中.......
1 2 3 4 5 | <activity android:name=".SunderFlowersActivity" android:label="@string/app_name" android:screenOrientation="portrait"> > </activity> |
在oncreate()方法中添加类
1 | setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); |
您必须设置每个活动的方向。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <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> |
使用
1 2 | android:configChanges="keyboardHidden|orientation" android:screenOrientation="portrait" |
1 2 3 4 5 6 7 8 9 10 11 | . . . <manifest . . . > . . . <activity android:name=".MyActivity" android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation"> </activity> </application> </manifest> </android> |
您可以为整个应用程序执行此操作,而无需使所有活动扩展为公共基类。
首先要确保在项目中包含Application子类。在您的应用首次启动时调用的onCreate()中,您注册了一个ActivityLifecycleCallbacks对象(API级别14+)以接收活动生命周期事件的通知。
这使您有机会在应用程序中的任何活动开始(或停止,恢复或其他)时执行您自己的代码。此时,您可以在新创建的活动上调用setRequestedOrientation()。
并且不要忘记在清单文件中添加app:name ="。MyApp"。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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); } .... }); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?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"> <intent-filter> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> |
我们可以使用属性或android:screenOrientation限制纵向或横向模式下的活动。
如果我的程序中有多个活动,那么您可以自由地限制任何一个模式中的任何一个活动,它永远不会影响您不想要的其他活动。
在您的项目中添加以下表示,
npm install
npm i react-native-orientation-locker
然后你使用清单类,如,
React_Native(您的项目文件夹)/
Android设备/应用/ src目录/主/ AndroidManifest.xml中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <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> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> |
谢谢!
在
然后将
在AndroidManifest.xml文件中添加
例如 :
1 2 | <activity android:name=".MapScreen" android:screenOrientation="portrait"></activity> |
在清单类中。
1 2 3 | <activity android:name=".yourActivity" .... android:screenOrientation="portrait" /> |
或以编程方式
1 | setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); |
注意:您应该在
它对我有用,尝试在AndroidManifest文件中添加此代码
1 2 3 4 5 6 7 8 9 10 11 | <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> |
在kotlin中,可以使用以下方法以编程方式实现
1 | requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT |
如果您的活动与第一个设备方向状态相关,请在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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); } |
为了帮助其他人,AndroidManifest.xml中ACTIVITY的以下属性就是您所需要的:
机器人:configChanges ="方向"
所以,完整的活动节点:
1 2 3 4 | <activity android:name="Activity1" android:icon="@drawable/icon" android:label="App Name" android:configChanges="orientation"> |