设备方向变化不改变布局。

4
我在layout-normal-land和layout-normal-port文件夹中有不同的替代布局,并且系统根据我在启动时设备的横向或纵向位置正确地调用它们。我的问题是,当我在启动应用程序后旋转设备时,它会尝试以某种方式将已显示的视图适应新的情况,从而创建混乱。
我该如何告诉系统,在执行期间应切换到替代布局?
我进行了一些实验并发现,当我没有设置android:configChanges="keyboardHidden|orientation"时,oncreate会再次被调用,从而得到正确的布局,但这不是我想要的。我认为这不正常,难道是Android(2.3.3.)的一个bug吗?

它应该根据方向变化自动切换XML布局,但如果您测试的设备没有“正常”屏幕,则会跳过这两个布局。 - Bill Gary
5个回答

12

通过包含

android:configChanges="orientation"

在你的清单文件中,你正在表明你希望自己处理方向变化。如果你希望系统为你处理它,那么应该将其删除。

自动处理非常有效。只有当你有特定原因时才应该覆盖它。

在正常操作中(没有上述清单条目),方向切换会导致当前活动被关闭,然后在其新方向中重新打开,从当前活动资源文件夹重新加载所有资源和布局。这个过程遵循所谓的“活动生命周期”。

如果你包含了上述清单条目,你就在说:“我会自己处理所有的变化。不要关闭我的活动”,所以现在你需要负责从活动中删除所有不需要的布局,并用适合当前方向的布局进行替换。


2
我现在将其删除了,但每次设备旋转时都会调用onCreate方法。这不是我想要的。您有什么建议吗? - michaelsmith
你不能两者兼得。你要么让系统处理方向变化,要么自己处理。看起来你没有理解基本的Android Activity生命周期。在尝试其他操作之前,请确保你理解了这一点。方向变化会关闭你的Activity并重新启动它,因此需要onCreate方法。另一种选择是手动更改活动布局以适应新的大小,这不是一项容易的任务。http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle - Kuffs
我开始明白了。重新启动我的活动不是一个选项,所以我需要进行onConfigurationChanged操作。在这个方法中使用setContentView是允许的吗?我已经尝试过了,但它会导致崩溃。 - michaelsmith
我认为SetContentView只能被调用一次。如果重新启动活动“不是一个选项”,那么您可能需要重新考虑应用程序的设计,因为方向更改并不是活动重新启动的唯一时间。例如,接收电话可能会导致您的应用程序在通话结束之前关闭。如果您的应用程序无法处理此问题,那么用户体验将不好。 - Kuffs
好的,我来自iOS系统,接听电话不会重新启动应用程序。这可不太好!我有一个正在运行的线程,用于接收GPS位置信息,并配置为能够在后台运行。那么接听电话也会停止它吗? - michaelsmith
你应该使用服务来进行此类操作,并从活动中与你的服务通信。如果你的 GPS 线程是活动的一部分,那么它可能会被关闭。通过编写适当的应用程序,用户将不会意识到活动正在重新启动。请参考我之前提到的“活动生命周期”。 - Kuffs

0

我遇到了同样的问题,但是在我的清单文件中没有android:configChanges="orientation"。

然而,在我的MainActivity中,我有[Activity(ConfigurationChanges = ConfigChanges.Orientation)]。这似乎是另一种覆盖自动方向处理的方法。


0

0

你在该活动的清单文件中是否有android:configChanges="orientation"?这将防止Android自动更改你的布局。


我在清单文件中有这个。我也有orientationChangeListener,然后我做了一个新的setContentView,导致崩溃:“您只允许在MapActivity中拥有一个MapView”。我已经放置了正确的布局文件夹。但仍然存在相同的问题... - michaelsmith

0

可能很明显,但是:

  1. 在res文件夹中,请确保您有标记为“layout”和“layout-land”的文件夹。
  2. 纵向和横向的.xml文件必须具有相同的文件名。

我有文件夹布局(没有main.xml),以及layout-land和layout-port(两者都有main.xml)。xml在启动时正确调用,问题是当我在执行期间更改设备方向时。 - michaelsmith

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