在方向变化上切换碎片或活动(即布局)

时间:2013-08-30 14:51:51

标签: android android-layout user-interface android-fragments screen-orientation

切换活动时出现问题&当方向发生变化时,某些设备尺寸上的碎片。在我的情况下,它是large屏幕,但可能会出现其他屏幕尺寸,具体取决于应用程序。我四处寻找答案,但似乎没有什么能正确解决这个问题。

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

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

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

    GMail message list GMail message display

    GMail in landscape orientation on large device

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

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

    • 检测两个活动中的方向更改,并启动其他活动(例如,通过使用FLAG_ACTIVITY_CLEAR_TOP)返回堆栈并使用新意图加载先前加载的活动。这是一个问题,因为方向更改代码只应在large设备上执行,这意味着混合代码可以检查活动代码中可用的布局。
    • 完全删除SubordinateActivity。它似乎有点多余,MainActivity可以管理片段本身,即使在normal大小的设备上,它可以根据需要交换MainFragment和SubordinateFragment。最后我不认为这解决了问题,因为MainActivity仍然依赖于布局文件来告诉它显示哪些和多少片段。这也违反了活动代表用户所做的独立事情的原则。

    以下是我一直在努力解决此问题的一些资源。正如我所说,这似乎是一个常见的问题,但似乎没有规范的Android解决方案。这是一个缺点,因为文档建议使用Fragments,而每个开发人员都会遇到这个问题。

    摘要:我的多窗格模式适用于xlarge设备。我试图解决的问题是在large设备上切换单窗格(纵向)和多窗格(横向)模式,这些设备只能处理横向多个窗格。

1 个答案:

答案 0 :(得分:3)

终止SubordinateActivity并让应用中的唯一入口点为MainActivity,然后决定使用MainFragmentSubordinateFragment填充整个视口。您可以通过looking at the developer docs for the design guide you linked to找到有关如何执行此操作的示例。

执行此操作后,您可以创建特定于大型和横向的资源文件夹res/layout/large-land as stated here,并为MainActivity设置布局文件,以包含两个类似于课程的片段# 2,在上一段的链接中。

创建它,与普通的XML布局一起更改为该文档中描述的内容应该自动处理您所描述的所有内容,因为方向更改在技术上是一种活动重新创建。