Android方向故障?

时间:2013-09-19 19:37:12

标签: android android-orientation orientation-changes

我相信在Android的定位处理方面偶然发现了一个固有的故障。

我有一个活动A

setContentView(R.layout.activity_main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

没有传感器意味着活动A不会受到物理设备旋转的影响。

我还有一个活动B,它有一个被覆盖的onSaveInstanceBundle

/*Will be called before orientation change*/
@Override
protected void onSaveInstanceState(Bundle currentState) {
      super.onSaveInstanceState(currentState);
      currentState.putBoolean(ApplicationConstants.Messages.ORIENTATION_CHANGED , true);
      currentState.putBoolean("RESTART", true);

      currentState.putString(ApplicationConstants.Messages.CURRENT_LANGUAGE,currentLocale);

    }
当屏幕方向改变时,总是调用onSaveInstance。 像A一样,B在onCreate()

下也有以下内容
setContentView(R.layout.activity_main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

现在出现了这个难题。

我从A按下一个按钮,当我按照正常纵向模式按住设备时,该按钮被编程为调用B.我有一个断点附加到onSaveInstance

正如预期的那样,调用B时不会调用onSaveInstance

然而,这是一个奇怪的事实。如果我以横向模式保持设备,然后调用B,则调用B的onSaveInstance,并且当程序在断点处暂停时,我们可以看到设备屏幕已经进行了美化。

因此,即使我对活动没有SENSOR参数,传感器实际上仍在工作。在活动开关IF之间,当我们在风景中保持设备时,目标活动在横向开始。在让断点离开后,B恢复到纵向视图。

我有一个很长的故事,说明为什么这会影响我正在开发的项目。我想知道是否有人对这种情况有任何见解。

总结一下,我的问题是:

在活动切换期间,Android系统是否忽略指定的方向,默认情况下使用设备的物理位置?我无法在androidManifest中设置方向。我已经注意到如果我们将定向模式放在清单中就不是这种情况。

2 个答案:

答案 0 :(得分:4)

  

在活动切换期间,android系统是否忽略指定的方向,默认情况下使用设备的物理位置? 。

这不完全正确,因为你指定方向。 SCREEN_ORIENTATION_NOSENSOR只是意味着“从现在开始忽略传感器并将其保持在当前方向”。直到onCreate()运行才会调用。没有人说“从一开始就锁定肖像”。

  

我无法在androidmanifest中设置方向。我已经注意到如果我们将定向模式放在清单中就不是这种情况。

出于好奇,你为什么不能?这是最常见的方式:

android:screenOrientation="portrait"
android:configChanges="orientation|screenSize"

它与清单条目正确锁定的原因是ActivityManager知道它应该在Activity运行之前被锁定。

答案 1 :(得分:1)

编辑:离开以下作为参考,但这显然 NOT 实际上有效。 :(


  

他希望应用程序在手机上锁定为肖像,并且   可以在平板电脑上自由旋转。

唉。嗯,你实际上可以通过清单来实现这一点。你如何做到这取决于你想要定义为“平板电脑”。让我们假设截止值是谷歌建议的sw600dp(最小宽度为600dp是7“平板电脑的一个很好的断点)。

您可以在res文件夹中创建以下文件结构:

res
    - values
        - styles.xml
    - values-sw600dp
        - styles.xml

values/styles.xml(这将是您的非平板电脑样式)中,为Activity定义以下样式:

<!-- This will be a base style that will affect both tablet and non-tablet -->
<style name="BaseTheme" parent="{{pick a base theme here -- e.g. Theme.Light}}"/>

<!-- This is the local style that will be used on devices whose smallest width
     is less than 600dp -->
<style name="BaseTheme.Activity">
    <item name="android:screenOrientation">portrait</item>
</style>

values-sw600dp/styles.xml

<!-- This is the local style that will be used on devices whose smallest
     width is greater than or equal to 600dp. We define nothing here other
     than the fact that the style exists, so it will have the default screen
     orientation - that is, it will rotate freely. -->
<style name="BaseTheme.Activity"/>

现在,在AndroidManifest.xmlactivity标记内添加:

android:theme="@style/BaseTheme.Activity"

你应该得到想要的结果。但是,您应首先删除您添加的所有Java代码,以尝试自行管理,因为它可能会与此冲突导致意外结果。