我在某些设备上切换活动和片段时遇到了问题,当发生方向变化时。在我的情况下,是大屏幕,但根据应用程序的不同屏幕大小也可能会发生。我已经寻找答案,但似乎没有一个正确的解决方法。
我有两个活动,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布局之间创建一些可怕的混乱。以下是我拥有的一些想法,但似乎没有一个是正确的:
我有两个活动,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,每个开发人员都会遇到这个问题。
- 任务和返回堆栈
- 如何控制Android返回堆栈
- 如何在屏幕方向更改时启动新活动?Android
- onNewIntent()生命周期和注册的侦听器
- 多窗格布局
- 切换从双窗格到单窗格的方向更改,保持片段堆栈
- Android Fragment方向更改问题
- Fragments在方向更改时恢复状态
总结:我已经使xlarge
设备的多窗格模式正常工作。我尝试解决的问题是在只能在横向方向处理多个窗格的large
设备上,在单窗格(纵向)和多窗格(横向)模式之间切换。