【发布时间】:2013-09-02 09:39:11
【问题描述】:
当发生方向更改时,我在某些设备尺寸上切换活动和片段时遇到问题。在我的情况下,它是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设备上执行,这意味着将检查哪些布局与活动代码可用的代码混合在一起。 - 完全放弃从属活动。这似乎有点多余,MainActivity 可以自己管理片段,即使在
normal大小的设备上,它也可以根据需要交换 MainFragment 和 SubordinateFragment。最后,我认为这并不能解决问题,因为 MainActivity 仍然依赖布局文件来告诉它要显示哪些片段以及显示多少片段。这也违反了 Activity 代表用户所做的离散事情的原则。
以下是我一直在寻找的一些资源,旨在尝试解决此问题。正如我所说,这似乎是一个常见问题,但似乎没有规范的 Android 解决方案。这有点缺点,因为文档建议使用 Fragments,而每个使用 Fragments 的开发人员都会遇到这个问题。
- Tasks and Back Stack
- How to Controll Android back stack
- How to start a new activity when screen orientation changes? Android
- onNewIntent() lifecycle and registered listeners
- Multi-pane Layouts
- Switch from dual pane to single pane on orientation change maintaining fragment stack
- android Fragment issue with orientation change
- Fragments restore state on orientation changed
总结:我的多窗格模式适用于xlarge 设备。我要解决的问题是在只能处理横向多个窗格的large 设备上在单窗格(纵向)和多窗格(横向)模式之间切换。
【问题讨论】:
-
哦!我热泪盈眶。在被问到之前,我已经看到了非常少的问题之一。祝您找到解决方案好运!不幸的是,除了 +1 和星之外,我无法做出贡献
标签: android android-layout user-interface android-fragments screen-orientation