一个Android定位故障?(An Android orientation glitch?)

2019-10-18 15:28发布

我相信在Android中的方向处理的内在故障已经迷迷糊糊。

我有一个活性的

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

无传感器意味着活动A不会由物理设备旋转的影响。

我也有它有一个重载onSaveInstanceBundle的活动B

/*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,其被编程以调用乙而我将装置保持在正常纵向模式的按钮。 我有连接到onSaveInstance断点

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

但是,这里有一个奇怪的事实。 如果我举在横向模式下的设备,然后调用B,B的onSaveInstance被调用,并且当程序在断点处暂停,我们可以看到该设备的屏幕拥有园景。

因此,即使我对活动没有传感器参数,传感器其实还在工作。 和一个活动开关IF DONE虽然我们装置保持在山水之间也,目标活动开始的风景线。 我让断点进去后,B恢复为纵向视图。

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

综上所述,我的问题是:

这是真的,一个活动开关时,Android系统会忽略指定方向,并默认使用该设备的物理位置? 我不能设置在androidManifest方向。 我已经注意到这个情况并非如此,如果我们把定向模式的清单。

Answer 1:

编辑:离开低于参考,但这显然实际工作。 :(


他希望应用程序被锁定到肖像在手机上,并可以自由地在平板电脑上转动。

啊。 那么,你实际上可以通过清单做到这一点。 你如何做到这一点取决于你要定义为“平板电脑”的内容。 让我们假设截止是谷歌与建议sw600dp (宽度为600 dp的最小宽度为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.xml ,你的内部activity标签中,添加:

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

你应该有希望的结果。 然而,你应该先除去所有的Java代码,你加入到尝试管理这个自己,因为它会与此产生意想不到的结果可能发生冲突。



Answer 2:

这是真的,一个活动开关时,Android系统会忽略指定方向,并默认使用该设备的物理位置? 。

这是不完全正确的,因为你没有指定的方向。 SCREEN_ORIENTATION_NOSENSOR仅仅表示“从现在开始忽略传感器,并保持它在当前的方向”。 这不会被调用到onCreate()运行。 无处你说“锁定到从一开始的画像”。

我不能设置在androidmanifest方向。 我已经注意到这个情况并非如此,如果我们把定向模式的清单。

出于好奇,你为什么不能? 这是做的最常用方法:

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

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



文章来源: An Android orientation glitch?