如何在 Android 上禁用方向更改?
-
19-09-2019 - |
解决方案
更新2013年4月:不要这样做。这不是在2009年,当我第一次回答了这个问题,它真的不是一个好主意,现在是个好主意。原因看到这个答案由hackbod:
添加android:configChanges="keyboardHidden|orientation"
到AndroidManifest.xml。这告诉哪些配置更改你要自己处理系统 - 在这种情况下,什么也不做。
<activity android:name="MainActivity"
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation">
请参阅参考开发 configChanges 获得更多的细节。
然而,应用程序可以在任何时间被中断,例如通过一个电话,让您真正应该添加代码来保存你的应用程序的状态,当它被暂停。
更新:由于Android 3.2的,你还需要添加 “屏幕大小”:
<activity
android:name="MainActivity"
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation|screenSize">
从开发指南处理配置改变自己
注意:与Android 3.2(API级13)中, “画面尺寸” 开始 当该装置在纵向和横向之间切换也改变 取向。因此,如果你想防止因运行时重新启动 对于API级别13或更高的发展方向变化时(如 由申报的minSdkVersion和targetSdkVersion属性),你 必须包括另外的“屏幕尺寸”价值的“方向” 值。也就是说,你必须声明
android:configChanges="orientation|screenSize"
。但是,如果您 应用程序的目标API级别12或更低,那么你总是活动 处理此配置变化本身(此配置更改 在Android 3.2或运行时,不会重新启动您的活动,甚至 较高的器件)。
其他提示
您需要修改的AndroidManifest.xml为 Intrications (以前阿什顿)提到,确保活动处理onConfigurationChanged事件只要你想它来处理。这是应该的样子:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
我总觉得你既需要
android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"
如所述,您的活动的设置android:configChanges
(清单文件)到keyboardHidden|orientation
然后:
1)重写onConfigurationChanged()
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//here you can handle orientation change
}
2)该行添加到您的活动的onCreate()
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
这是不是添加同一行onConfigurationChanged
更好,因为你的应用程序将变为纵向模式,然后返回到横向(它会发生只有一次,但是这很烦人)。
您也可以为您的活动android:screenOrientation="nosensor"
(在清单)。 但是使用这种方式你是无法处理的方向改变的。
使用此..
android:screenOrientation="portrait"
在您的活动onCreate方法使用以下代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
现在您的方向将被设置为纵向和永远不会改变。
在AndroidManifest.xml文件,您要添加锁定最后screenOrientation
线的每个活动:
android:label="@string/app_name"
android:name=".Login"
android:screenOrientation="portrait" >
或机器人:screenOrientation = “风景”强>
在您的的AndroidManifest.xml 文件:
<activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">
或
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
要由代码锁定屏幕必须使用在屏幕上(0,90,180,270)的实际旋转,你必须知道它的自然位置,在智能电话的自然的位置将是在纵向和在片剂,这将是风景。
下面是代码(锁定和解锁的方法),它已在某些设备(如智能手机和片剂)进行了测试,并将其巨大的。
public static void lockScreenOrientation(Activity activity)
{
WindowManager windowManager = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
Configuration configuration = activity.getResources().getConfiguration();
int rotation = windowManager.getDefaultDisplay().getRotation();
// Search for the natural position of the device
if(configuration.orientation == Configuration.ORIENTATION_LANDSCAPE &&
(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) ||
configuration.orientation == Configuration.ORIENTATION_PORTRAIT &&
(rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270))
{
// Natural position is Landscape
switch (rotation)
{
case Surface.ROTATION_0:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
case Surface.ROTATION_90:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
break;
case Surface.ROTATION_180:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
break;
case Surface.ROTATION_270:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
}
}
else
{
// Natural position is Portrait
switch (rotation)
{
case Surface.ROTATION_0:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
case Surface.ROTATION_90:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
case Surface.ROTATION_180:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
break;
case Surface.ROTATION_270:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
break;
}
}
}
public static void unlockScreenOrientation(Activity activity)
{
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
在 Visual Studio Xamarin 中:
- 添加:
using Android.Content.PM;
到您的活动名称空间列表。
- 添加:
[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]
作为类的属性,如下所示:
[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Activity
{...}
添加
android:configChanges="keyboardHidden|orientation|screenSize"
向清单中。