我如何禁用景观模式的一些观点在我的Android应用程序?
将android:screenOrientation="portrait"添加到AndroidManifest.xml中的活动中。例如:
<activity android:name=".SomeActivity"
android:label="@string/app_name"
android:screenOrientation="portrait" />
由于这已经成为一个超级流行的答案,我感到非常内疚,因为强制肖像很少是它经常应用的问题的正确解决方案。 强制肖像的主要注意事项:
This does not absolve you of having to think about activity lifecycle events or properly saving/restoring state. There are plenty of things besides app rotation that can trigger an activity destruction/recreation, including unavoidable things like multitasking. There are no shortcuts; learn to use bundles and retainInstance fragments. Keep in mind that unlike the fairly uniform iPhone experience, there are some devices where portrait is not the clearly popular orientation. When users are on devices with hardware keyboards or game pads a la the Nvidia Shield, on Chromebooks, on foldables, or on Samsung DeX, forcing portrait can make your app experience either limiting or a giant usability hassle. If your app doesn't have a strong UX argument that would lead to a negative experience for supporting other orientations, you should probably not force landscape. I'm talking about things like "this is a cash register app for one specific model of tablet always used in a fixed hardware dock."
所以大多数应用程序应该让手机传感器、软件和物理配置自己决定用户想要如何与你的应用程序交互。但是,如果你对你的用例中传感器方向的默认行为不满意,你可能仍然需要考虑一些情况:
If your main concern is accidental orientation changes mid-activity that you think the device's sensors and software won't cope with well (for example, in a tilt-based game) consider supporting landscape and portrait, but using nosensor for the orientation. This forces landscape on most tablets and portrait on most phones, but I still wouldn't recommend this for most "normal" apps (some users just like to type in the landscape softkeyboard on their phones, and many tablet users read in portrait - and you should let them). If you still need to force portrait for some reason, sensorPortrait may be better than portrait for Android 2.3 (Gingerbread) and later; this allows for upside-down portrait, which is quite common in tablet usage.
在阅读这篇文章之前,我不知道AndroidManifest.xml文件开关,所以在我的应用程序中,我使用了这个代替:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // Fixed portrait orientation
在<apphome>/platform/android目录下,创建AndroidManifest.xml(从生成的目录中复制它)。
然后添加android:screenOrientation="portrait"到所有的活动元素。
在AndroidManifest.xml文件中添加android:screenOrientation="portrait"。
例如:
<activity
android:name=".MapScreen"
android:screenOrientation="portrait"></activity>
如果你想要用户设置,那么我建议setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
您可以从设置菜单更改设置。
我需要这样做是因为我的计时器必须与屏幕上的内容相对应,旋转屏幕将破坏当前活动。
Use:
android:configChanges="keyboardHidden|orientation"
android:screenOrientation="portrait"
<android . . . >
. . .
<manifest . . . >
. . .
<application>
<activity
android:name=".MyActivity"
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation">
</activity>
</application>
</manifest>
</android>
在你声明你的活动的manifest文件中添加android:screenOrientation="portrait"。是这样的:
<activity
android:name=".yourActivity"
....
android:screenOrientation="portrait" />
如果你想使用Java代码,试试:
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
在onCreate()中调用setContentView方法之前。
你所需要的就是AndroidManifest.xml中活动的以下属性:
android:configChanges="orientation"
那么,完整的活动节点:
<activity
android:name="Activity1"
android:icon="@drawable/icon"
android:label="App Name"
android:configChanges="orientation">
这里的很多答案都建议在AndroidManifest.xml文件中使用“portrait”。这似乎是一个很好的解决方案-但正如文档中所指出的那样,您正在挑出可能只有横屏的设备。你还强迫某些设备(在横屏下工作得最好)进入竖屏,而没有得到正确的方向。
我的建议是用“nosensor”代替。这将使设备使用其默认的首选方向,不会阻止谷歌Play上的任何购买/下载,并将确保传感器不会破坏你的游戏(在我的情况下是NDK)。
您必须设置每个活动的方向。
<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>
只需在你的清单中添加这一行:
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>
如果你想禁用Android应用程序(或单个活动)的横向模式,你需要做的就是添加:
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);
在Activity的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);
方向Util类
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);
}
你可以通过在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);
}
如果你不想经历在每个活动清单条目中添加方向的麻烦,创建一个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......
}
在Kotlin中,同样可以使用下面的代码以编程方式实现:
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()中,当你的应用程序第一次启动时调用,你注册了一个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);
}
....
});
}
}
在manifest类中:
<activity android:name=".yourActivity"
....
android:screenOrientation="portrait" />
或通过编程:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
注意:你应该在你的onCreate()活动的setContentView方法之前调用这个。
将以下命令添加到您的项目中,
npm install
npm i react-native-orientation-locker
然后你使用一个manifest类, React_Native(你的项目文件夹)/ 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度。)
如果活动在多窗口模式下运行,系统将忽略此属性。
更多:https://developer.android.com/guide/topics/manifest/activity-element
在你的manifest中添加android:screenOrientation="portrait"。如果您想为特定的活动应用模式,请在所需的活动标记中定义此模式。或者在应用程序标签中定义整个应用程序。比如:
<application
<!-- ... -->
android:screenOrientation="portrait"
</application>
推荐文章
- Android-Facebook应用程序的键散列
- 登出时,清除活动历史堆栈,防止“返回”按钮打开已登录的活动
- 如何改变标题的活动在安卓?
- 如何隐藏动作栏之前的活动被创建,然后再显示它?
- 是否有一种方法以编程方式滚动滚动视图到特定的编辑文本?
- 在Android中将字符串转换为Uri
- 如何在NestedScrollView内使用RecyclerView ?
- 移动到另一个EditText时,软键盘下一步点击Android
- Android应用中的GridView VS GridLayout
- Activity和FragmentActivity的区别
- 右对齐文本在android TextView
- 权限拒绝:start前台需要android.permission.FOREGROUND_SERVICE
- 如何更改android操作栏的标题和图标
- Android Split字符串
- 让一个链接在安卓浏览器启动我的应用程序?