在方向更改上切换片段或活动(即布局)

在发生方向更改时,我在某些设备尺寸上切换活动和片段时遇到问题。 在我的情况下,它是large屏幕,但它可能发生在其他屏幕尺寸取决于应用程序。 我四处寻找答案,但似乎没有妥善解决这个问题。

我有两个活动,MainActivity和SubordinateActivity。 MainActivity是该应用唯一的入口点; MainActivity启动SubordinateActivity。 每个活动都有自己的片段,MainFragment和SubordinateFragment。 在normal设备上运行时,不管方向如何,屏幕上只有一个片段的空间足够多。 在这种情况下,每个活动都会管理自己的片段。 在xlarge设备上,无论方向如何,都有足够的空间存放两个碎片。 在这种情况下,有不同的布局文件允许在屏幕上显示两个片段。 MainFragment和SubordinateFragment都由MainActivity管理(从不使用SubordinateActivity)。

large屏幕出现麻烦。 使用横向方向,有足够的空间用于两个片段,但纵向方向不存在。 我有每个适当的布局文件。 在横向模式下,MainActivity管理这两个片段(与xlarge设备一样),并且在纵向模式下,每个活动管理自己的片段(与normal设备一样)。 这在两种情况下会产生问题:

  • SubordinateActivity以纵向模式加载,方向更改为横向模式。 我想要的 :SubordinateActivity应该被丢弃,并且MainActivity应该加载,其中先前由SubordinateActivity显示的内容显示在它自己的SubordinateFragment中。 问题 :SubordinateActivity在横向模式下自行加载。
  • MainActivity在横向模式下加载MainFragment和SubordinateFragment,并且方向切换为纵向。 我想要的 :以前在SubordinateFragment中显示的内容现在应该由SubordinateActivity单独显示。 问题 :MainActivity仅显示来自MainFragment的内容。
  • 这个问题的一个很好的例子是GMail应用程序。 以下是该应用的一些屏幕截图,以防它不清楚我在说什么。 我意识到GMail应用的UI实际上比我的更复杂,但问题是一样的。

    GMail消息列表GMail信息显示

    在大型设备上横向导航

    我相信这是其他人遇到的问题,因为GMail开发者也遇到了这个问题。 我找不出什么好的解决方案,因为每种可能性似乎都涉及违反Android UI最佳实践,或者在Activity代码和XML布局之间创建一些不合理的纠结。

    以下是我的一些想法,其中没有一个看起来确实是正确的:

  • 检测两个活动中的方向更改,然后启动其他活动(例如,通过使用FLAG_ACTIVITY_CLEAR_TOP)来返回堆栈并加载之前加载的活动,并带有新的意图。 这是一个问题,因为方向更改代码只能在large设备上执行,这意味着混合代码检查哪些布局可用于活动代码。
  • 完全删除SubordinateActivity。 看起来有点多余,MainActivity可以管理片段本身,即使在normal大小的设备上它可以根据需要交换MainFragment和SubordinateFragment。 最后,我不认为这解决了这个问题,因为MainActivity仍然依赖布局文件来告诉它显示哪些和多少片段。 这也违反了活动代表用户所做的离散事情的原则。
  • 以下是我一直在努力解决此问题的一些资源。 正如我所说,这似乎是一个常见问题,但似乎没有规范的Android解决方案。 这是一个缺点,因为文档建议使用Fragments,每个开发人员都会遇到这个问题。

  • 任务和返回堆栈
  • 如何控制Android后退堆栈
  • 如何在屏幕方向更改时开始新的活动? Android的
  • onNewIntent()生命周期和注册监听器
  • 多窗格布局
  • 在维护片段堆栈的方向更改时,从双窗格切换到单窗格
  • Android的碎片问题与方向的变化
  • 片段在方向改变时恢复状态
  • 简介 :我有适用于xlarge设备的多窗格模式。 我试图解决的问题是在large设备上只能在横向上处理多个窗格的单窗格(纵向)和多窗格(横向)模式之间切换。


    杀死SubordinateActivity并在应用程序中拥有唯一的入口点,然后MainActivity决定用MainFragmentSubordinateFragment填充整个视口。 您可以通过查看链接到的设计指南的开发人员文档来找到有关如何执行此操作的示例。

    完成此操作后,您可以按照此处所述创建特定于大型和横向, res/layout/large-land的资源文件夹,并为MainActivity设置布局文件,以在前一个链接中包含与课程#2相似的两个片段段。

    除了正常的XML布局外,更改为该文档中描述的内容应该会自动处理您描述的所有内容,因为在技术上定位更改在技术上是重新创建的活动。

    链接地址: http://www.djcxy.com/p/15641.html

    上一篇: Switching Fragments or Activities (ie layouts) on Orientation Change

    下一篇: Google app engine dev