当发生方向变化时,我在某些设备尺寸上切换活动和片段时遇到问题。就我而言,它是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 开发人员也遇到过。我不知道什么是好的解决方案,因为每一种可能性似乎都涉及违反 Android UI 最佳实践,或者在 Activity 代码和 XML 布局之间创建一些不合情理的纠结。
以下是我的一些想法,但似乎没有一个是真正正确的:
- 检测两个活动的方向变化,并启动另一个活动(例如,通过使用 FLAG_ACTIVITY_CLEAR_TOP)以返回堆栈并以新的意图加载先前加载的活动。这是一个问题,因为方向更改代码应该只在
large
设备上执行,这意味着混合代码检查哪些布局与活动代码可用。 - 完全删除 SubordinateActivity。这似乎有点多余,MainActivity 可以自己管理片段,即使在
normal
大小设备上它可以根据需要交换 MainFragment 和 SubordinateFragment。最后,我认为这并不能解决问题,因为 MainActivity 仍然依赖布局文件来告诉它要显示哪些片段以及显示多少片段。这也违反了 Activity 代表用户所做的离散事情的原则。
以下是我一直在寻找的一些资源,试图解决这个问题。正如我所说,这似乎是一个常见问题,但似乎没有规范的 Android 解决方案。这是一个缺点,因为文档建议使用 Fragments,并且每个这样做的开发人员都会遇到这个问题。
- 任务和回栈
- 如何控制 Android 回栈
- 屏幕方向更改时如何启动新活动?安卓
- onNewIntent() 生命周期和注册的监听器
- 多窗格布局
- 在方向更改时从双窗格切换到单窗格,维护片段堆栈
- 方向改变的android片段问题
- 片段在方向改变时恢复状态
摘要:我有适用于设备的多窗格模式xlarge
。我要解决的问题是在large
只能处理横向多个窗格的设备上在单窗格(纵向)和多窗格(横向)模式之间切换。