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

68

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


只需注意,在Android 1.5中似乎存在一个错误。如果您使用自定义屏幕大小(例如800x480,就像在Apad上一样)并将其强制为横向(无论是通过XML还是从代码中),那么它实际上将处于纵向状态。 - Dornbi
如果你想要从代码中锁定或解锁屏幕方向(这样更加灵活),你可以直接从 https://github.com/delight-im/Android-BaseLib/blob/master/Source/src/im/delight/android/baselib/Screen.java 调用 Screen.lockOrientation(this) - caw
7个回答

58

当键盘打开或关闭时,很容易覆盖默认行为并禁止屏幕方向更改。

修改清单文件

打开清单文件,切换到应用程序选项卡,选择您希望覆盖方向更改行为的所需 Activity。

  1. 在Attributes中,您需要更改两个字段: 屏幕方向:选择所需的肖像或风景模式。 这将是默认布局。

  2. 选择要覆盖的Config更改事件: 在此情况下,这些是keyboardHidden和orientation。

修改Activity实现

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

只需将以下函数添加到Activity类中即可。

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

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

就是这样!现在您的方向将始终保持不变。

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

(基于SDK 1.1)


16
仅仅调用超类不会改变任何东西吗? - mxk
10
我刚刚在玩一个非常相似的东西——我认为清单文件的更改已经足够,至少对我来说是这样的(这似乎是合乎逻辑的,正如Matthias指出的那样)。 - alex_c
仅在清单文件中更改即可锁定方向,那么onConfigurationChanged()的目的是什么? - Datta Kunde
根据我的测试:如果你只是改变清单文件而不覆盖onConfigurationChanged函数,那么onCreate()和整个活动生命周期事件将被调用。如果你改变了清单文件并覆盖了onConfigurationChanged函数,它就不会被调用。 - ofirbt

28

你可以在代码中使用以下行执行相同的更改(在 activity 中调用):

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
一旦您进行这个调用,您的应用程序将保持横屏(或纵向)模式。您可以使用同样的调用(使用不同的ActivityInfo枚举)再次使其对方向变化敏感。

开发方向感知Android应用程序中有一篇完整的DevX文章。

(警告:自从我发布这个链接后,DevX已经加了注册墙)

这是唯一一个在Android 2.2上对我有效的答案。谢谢! - Zach Rattner

21

如果你通过 AndroidManifest.xml 或者使用 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 来设置屏幕方向,那么在 平板电脑 上会遇到问题。它们的自然/默认方向是横向的。

如果你真的想要 完全忽略屏幕方向的更改,我建议使用 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); 值。我在 Stack Overflow 问题 Android natural sensor orientation help 中有更多讨论。

这里是 XML 代码:

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

这不会旋转屏幕。 - Don Larynx
1
我不确定我理解了...这就是重点,避免旋转屏幕。 - bytebender
“完全忽略屏幕方向变化”意味着当旋转时,数据将保持不变。 - Don Larynx

14

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

<activity 
    android:name=".MyActivity" 
    android:screenOrientation="portrait"
    android:configChanges="orientation|keyboardHidden|keyboard"/>`
在这种情况下,您应该为每个活动设置属性。我没有找到适用于所有应用程序的内联解决方案。

3
将以下内容添加到活动中: android:configChanges="orientation|screenSize" 该代码用于在屏幕旋转或屏幕尺寸发生变化时,避免重新启动活动。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接