【问题标题】:Switching Fragments or Activities (ie layouts) on Orientation Change在方向改变时切换片段或活动(即布局)
【发布时间】:2013-09-02 09:39:11
【问题描述】:

当发生方向更改时,我在某些设备尺寸上切换活动和片段时遇到问题。在我的情况下,它是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 开发人员也遇到过。我不知道什么是好的解决方案,因为每一种可能性似乎都涉及违反 Android UI 最佳实践,或者在 Activity 代码和 XML 布局之间创建一些不合情理的纠结。

以下是我的一些想法,但似乎都不正确:

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

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

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

【问题讨论】:

  • 哦!我热泪盈眶。在被问到之前,我已经看到了非常少的问题之一。祝您找到解决方案好运!不幸的是,除了 +1 和星之外,我无法做出贡献

标签: android android-layout user-interface android-fragments screen-orientation


【解决方案1】:

杀死SubordinateActivity 并让应用程序中的唯一入口点是MainActivity,然后它决定用MainFragmentSubordinateFragment 填充整个视口。您可以通过looking at the developer docs for the design guide you linked to 找到有关如何执行此操作的示例。

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

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

【讨论】:

  • “kill SubordinateActivity”是指从代码中删除它,只使用一个活动,如我上面列出的第二个选项,还是其他的?另外,澄清一下,MainActivity 是唯一的入口点。
  • 我的意思是只使用一个活动。你正在做的非常接近一个主从视图,它最适合一个活动。
猜你喜欢
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多