屏幕旋转时切换片段或活动(即布局)

7
我在某些设备上切换活动和片段时遇到了问题,当发生方向变化时。在我的情况下,是大屏幕,但根据应用程序的不同屏幕大小也可能会发生。我已经寻找答案,但似乎没有一个正确的解决方法。
我有两个活动,MainActivity和SubordinateActivity。MainActivity是应用程序的唯一入口点; MainActivity启动SubordinateActivity。每个活动都有自己的片段,MainFragment和SubordinateFragment。在正常设备上运行时,无论方向如何,屏幕上只有足够的空间容纳一个片段。在这种情况下,每个活动将管理自己的片段。在xlarge设备上,无论方向如何,都有足够的空间容纳两个片段。在这种情况下,有不同的布局文件允许在屏幕上显示两个片段。MainActivity管理MainFragment和SubordinateFragment(SubordinateActivity从未使用)。
问题出现在大屏幕上。在横向方向使用时,有足够的空间容纳两个片段,但在纵向方向上则没有。我拥有每个片段的正确布局文件。在横向模式下,MainActivity管理两个片段(与xlarge设备一样),而在纵向模式下,每个活动都管理自己的片段(与正常设备一样)。这会在两种情况下产生问题:
1. SubordinateActivity在纵向模式下加载,方向变为横向模式。我想要的是:SubordinateActivity应该被丢弃,MainActivity应该加载,并显示以前由SubordinateActivity显示的内容,显示在其自己的SubordinateFragment中。问题是:SubordinateActivity在横向模式下仍然保持加载状态。 2. 在横向模式下,MainActivity加载MainFragment和SubordinateFragment,并将方向切换到纵向。我想要的是:之前在SubordinateFragment中显示的内容现在应该由SubordinateActivity独自显示。问题是:MainActivity仅显示来自MainFragment的内容。
GMail应用程序是此问题的一个很好的例子。以下是该应用程序的一些屏幕截图,以防不清楚我在说什么。我意识到GMail应用程序的用户界面实际上比我的更复杂,但问题是相同的。
我确信其他人也遇到了这个问题,因为GMail开发人员也遇到了这个问题。我无法确定一个好的解决方法,因为每个可能性似乎都涉及违反Android UI最佳实践或在Activity代码和XML布局之间创建一些可怕的混乱。以下是我拥有的一些想法,但似乎没有一个是正确的:
  • 在两个活动中检测方向变化,并通过使用FLAG_ACTIVITY_CLEAR_TOP启动另一个活动,以返回堆栈并加载先前加载的活动,使用新意图。这是一个问题,因为方向更改代码只应在large设备上执行,这意味着将检查哪些布局可用的代码与活动代码混合。
  • 完全删除SubordinateActivity。它似乎有点多余,MainActivity可以自己管理片段,即使在normal大小的设备上,它也可以根据需要交换MainFragment和SubordinateFragment。最终我认为这并没有解决问题,因为MainActivity仍然依赖于布局文件告诉它显示哪些和多少个片段。这也违反了Activity代表用户执行的离散事物的原则。

以下是我一直在查看的一些资源,尝试解决这个问题。正如我所说,这似乎是一个常见的问题,但似乎没有标准的Android解决方案。这是一个缺点,因为文档推荐使用Fragments,每个开发人员都会遇到这个问题。

总结:我已经使xlarge设备的多窗格模式正常工作。我尝试解决的问题是在只能在横向方向处理多个窗格的large设备上,在单窗格(纵向)和多窗格(横向)模式之间切换。


3
哦!我哭了。这是我看到的很少几个在提问之前进行了适当研究和撰写的问题之一。祝你好运找到解决方案!不幸的是,除了给予一个+1和一个星号之外,我不能作出贡献。 - STT LCU
1个回答

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

在此之后,您可以创建一个特定于大型和横向屏幕的资源文件夹res/layout/large-land如此处所述,并设置MainActivity的布局文件,包括两个片段,类似于前面段落中链接的第2课。

除了正常的XML布局更改外,创建它并按照文档中描述的方式进行设置应自动处理您所描述的所有内容,因为方向更改从技术上讲是一次活动重新创建。


“kill SubordinateActivity” 您的意思是从代码中删除它,只使用单个活动,就像我上面列出的第二个选项那样,还是有其他不同的意思?另外,为了澄清,MainActivity 是唯一的入口点。 - Paul Holden
我的意思是只使用一个活动。你正在做的非常接近主细节视图,它最好使用一个活动。 - Kasra Rahjerdi

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