如何使应用程序忽略屏幕方向变化?


67

有没有办法使应用程序完全忽略屏幕方向变化?


请注意,显然在Android 1.5中存在一个错误。如果您使用自定义屏幕尺寸(例如,在Apad上为800x480)并强制使其横向(通过XML或通过代码),则实际上它是纵向的。
恩比(Dornbi)2010年

你可能只是调用Screen.lockOrientation(this)github.com/delight-im/Android-BaseLib/blob/master/Source/src/im/...如果你想锁定和解锁代码从方向(这是更灵活)
CAW

Answers:


58

可以很容易地覆盖默认行为,并在打开/关闭键盘时禁止更改屏幕方向。

修改清单

打开清单,切换到“应用程序”选项卡,然后为方向更改行为选择要覆盖的所需活动。

  1. 在“属性”中,您需要更改两个字段:屏幕方向:选择纵向还是横向-任意选择。这将是默认布局。

  2. 选择要覆盖的配置更改事件:在这种情况下,这些事件是keyboardHidden和方向。

修改活动实施

现在,您需要在所需的Activity中覆盖单个函数。

只需将下面的函数添加到您的Activity的类中即可。

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}

如果使用Source->Override/Implement Methods 菜单选项,则这是默认实现。

而已!现在,您的方向将始终保持不变。

请记住,此设置是针对每个活动的-因此您需要为每个希望禁止方向更改的活动重复此步骤!

(基于SDK 1.1)


16
难道不只是通过调用超类根本不做任何改变吗?
Matthias

10
我只是在玩一些非常相似的东西-我认为Manifest文件的更改已经足够了,至少对我来说是这样(正如Matthias所指出的那样,这似乎是合乎逻辑的)。
alex_c

更改清单足以锁定方向,那么onConfigurationChanged()的目的是什么?
Datta Kunde

就我的测试而言:如果仅更改清单而不覆盖onConfigurationChanged函数,则将调用onCreate()和整个活动生命周期事件。如果您要更改清单并覆盖onConfigurationChanged函数,则不会调用该清单。
ofirbt 2011年

28

您可以使用以下行(在活动中调用)对代码进行相同的更改:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

拨打电话后,您的应用程序将保持横向(或纵向)模式。您可以使用相同的调用(使用不同的ActivityInfo枚举)使它再次对方向转换敏感。

开发方向感知的Android应用程序中有关于该主题的完整DevX文章。

(警告:自从我发布此链接以来,DevX架起了注册墙。)


这是唯一适用于Android 2.2的答案。谢谢!
扎克·拉特纳

21

如果您通过AndroidManifest.xml或进行设置,setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);则会遇到平板电脑问题。它们的自然/默认方向是风景。

如果您确实要完全忽略屏幕方向更改,则可以使用此setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);值。我会在Stack Overflow问题中讨论有关Android自然传感器方向帮助的更多信息

这是xml:

<activity 
    android:name=".MyActivity" 
    android:screenOrientation="nosensor"
    android:configChanges="orientation|keyboardHidden|keyboard"/>

这不会旋转屏幕。
Don Larynx

1
我不确定我是否遵循...这就是要避免旋转屏幕。
bytebender 2015年

“完全忽略屏幕方向变化”表示旋转时,数据将保持不变。
Don Larynx

14

您可以在AndroidManifest.xml文件中定义您的活动,如下所示:

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

在这种情况下,您应该为每个活动设置属性。我没有找到适用于所有应用程序的内联解决方案。


2
<activity  android:screenOrientation="portrait"></activity>

2

将此添加到活动中:

android:configChanges="orientation|screenSize"


1

您想阅读当前方向,并在整个活动的整个生命周期中保持这种方式,因此在onCreate结束时,我要做的是以下操作:

// choose an orientation and stay in it
if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
else if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
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.