7

当发生方向变化时,我在某些设备尺寸上切换活动和片段时遇到问题。就我而言,它是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 的内容。

这个问题的一个很好的例子是 GMail 应用程序。以下是该应用程序的一些屏幕截图,以防我不清楚我在说什么。我意识到 GMail 应用程序的 UI 实际上比我的更复杂,但问题是一样的。

GMail 邮件列表 GMail 消息显示

大型设备上的横向 GMail

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

以下是我的一些想法,但似乎没有一个是真正正确的:

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

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

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

4

1 回答 1

3

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

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

创建它,以及将您的正常 XML 布局更改为该文档中描述的内容,应该会自动处理您描述的所有内容,因为方向更改在技术上是重新创建活动。

于 2013-08-30T15:00:43.637 回答