首页 文章

在方向变化上切换碎片或活动(即布局)

提问于
浏览
7

当方向发生变化时,我在某些设备尺寸上切换活动和片段时遇到问题 . 在我的情况下,它是 large 屏幕,但它可能会发生在其他屏幕尺寸,具体取决于应用程序 . 我四处寻找答案,但似乎没有什么能正确解决这个问题 .

我有两个活动,MainActivity和SubordinateActivity . MainActivity是应用程序的唯一入口点; MainActivity启动SubordinateActivity . 每个活动都有自己的片段,MainFragment和SubordinateFragment . 在 normal 设备上运行时,无论方向如何,屏幕上一次只有一个片段有足够的空间 . 在这种情况下,每个活动都将管理自己的片段 . 在 xlarge 设备上,无论方向如何,都有足够的空间容纳两个片段 . 在这种情况下,有不同的布局文件,允许屏幕上的两个片段 . MainFragment和SubordinateFragment都由MainActivity管理(从不使用SubordinateActivity) .

large 屏幕出现问题 . 使用横向方向,有足够的空间容纳两个碎片,但纵向方向则没有 . 我有适当的布局文件 . 在横向模式下,MainActivity管理两个片段(与 xlarge 设备一样),在纵向模式下,每个活动管理自己的片段(与 normal 设备一样) . 这会在两种情况下产生问题:

  • SubordinateActivity以纵向模式加载,方向更改为横向模式 . What I want :SubordinateActivity应该被丢弃,MainActivity应该加载,SubordinateActivity先前显示的内容显示在它自己的SubordinateFragment中 . Problem :SubordinateActivity在横向模式下自行加载 .

  • MainActivity在横向模式下加载MainFragment和SubordinateFragment,方向切换为纵向 . What I want :以前显示在SubordinateFragment中的内容现在应由SubordinateActivity单独显示 . Problem :MainActivity仅显示MainFragment中的内容 .

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

GMail message list

GMail message display

GMail in landscape orientation on large device

我想出了一个 good 解决方案是什么,因为每种可能性似乎都涉及违反Android UI最佳实践,或者在Activity代码和XML布局之间创建一些不合理的纠结 .

以下是我的一些想法,其中没有一个看起来真的正确:

  • 检测两个活动中的方向更改,并启动其他活动(例如,通过使用FLAG_ACTIVITY_CLEAR_TOP)返回堆栈并使用新意图加载先前加载的活动 . 这是一个问题,因为方向更改代码只应在 large 设备上执行,这意味着混合代码,用于检查活动代码可用的布局 .

  • 完全删除SubordinateActivity . 它似乎有点多余,MainActivity可以自己管理片段,即使在 normal 大小的设备上,它可以根据需要交换MainFragment和SubordinateFragment . 最后我不认为这解决了问题,因为MainActivity仍然依赖于布局文件来告诉它要显示哪些和多少片段 . 这也违反了Activity表示用户所做的离散事物的原则 .

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

Summary :我的多窗格模式适用于 xlarge 设备 . 我正在尝试解决的问题是在 large 设备上切换单窗格(纵向)和多窗格(横向)模式,这些设备只能以横向方式处理多个窗格 .

1 回答

  • 3

    杀死 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布局一起更改为该文档中描述的内容应该自动处理您自描述的所有内容方向改变在技术上是一种活动再创造 .

相关问题