【发布时间】:2012-04-20 13:43:34
【问题描述】:
我正在尝试了解如何使用 Fragments 创建能够很好地适应多种屏幕和布局的应用程序。我研究了几个例子:
- Android 开发者指南中的Fragments 文档。
- Google IO app
- 来自ActionBar Sherlock 的片段样本。
所有这些都提倡多重Activity 方法:
- 在大屏幕上,显示一个
Activity和多个Fragments - 在较小的屏幕上,将
Fragments 拆分为多个Activitys。
我想到了另一种方法——单个Activity一个:
- 有一个
Activity,其中包含所有Fragment。 - 根据屏幕尺寸和方向,显示/隐藏适当的
Fragment(s)(使用FragmentTransaction.show()/FragmentTransaction.hide())。
使用 Android 开发者指南使用的相同“新闻文章列表/文章内容”示例进行说明:
- 让
News活动同时包含ArticleListFragment和ArticleReaderFragment。 - 在选项卡上,始终显示两个片段。
- 在电话上,
ArticleReaderFragment最初是隐藏的。当从列表中选择一篇文章时,ArticleListFragment被隐藏,ArticleReaderFragment被显示。
有人用过类似的方法吗?这种方法可能有任何实际的缺点吗?与多活动方式相比,它看起来更好/更差吗?例如,片段不能在 XML 中显示/隐藏 - 为此必须使用FragmentTransaction。
编辑 1:假设场景的描述
想象一个应用程序可以在屏幕上一次显示多达三个“窗格”。此外,这些是需要考虑的因素:
- 手机一次只能显示一个窗格(无论纵向/横向)
- 7 英寸平板电脑可以显示 2 个窗格,在纵向模式下垂直拆分,在横向模式下水平拆分。
- 10 英寸以上的平板电脑可以显示 2 个窗格,纵向拆分; 3 个窗格横向水平拆分。
为简单起见,让我们不要讨论电视屏幕。
现在,将其转化为设计:
- 我们有三个片段:Frag1、Frag2 和 Frag3。
- 在最简单的情况下,所有三个片段都在一个 Activity 中(我们称之为 ActivityA)。这是 10 英寸横向外壳。
- 另一种“简单”的情况是当每个 Fragment 都在自己的 Activity 中时 - ActivityA 包含 Frag1; ActivityB 包含 Frag2,ActivityC 包含 Frag3。
到目前为止,我们还没有考虑任何与 Android 开发人员指南中介绍的新闻阅读器示例有显着差异的内容。唯一的主要区别是有 三个 片段而不是两个。
现在,7 英寸标签的情况下只能容纳 2 个碎片。这将如何工作?请注意,这里有两种可能的组合:
- Frag1 和 Frag2 正在显示。
- Frag2 和 Frag3 正在显示。
我只是无法理解这一点。我是否在 ActivityA 中完成所有这些操作?我只是创建一个全新的 ActivityD 吗?我需要创建多少个布局(我数了大约 8 个)?是不是排列太多了?
我确实意识到我上面提出的单一活动方法也可能不适合这种情况 - 因为显示/隐藏片段本身并不简单。
关于如何在不被布局和组合淹没的情况下处理这个问题有什么建议吗?
【问题讨论】:
-
我个人会尽可能少地使用活动,因为这个问题完全暴露了活动/片段的 API 混乱。 Android 开发人员没有转换活动并允许同时显示多个活动,而是注入了这些称为 Fragments 的“伪活动”,它们有自己的生命周期“某种绑定”到一个活动(但并非在所有情况下都是如此) )。因此,在我看来,处理更少的活动可以让你最接近想象一个只依赖片段的美好世界。
-
@MartínMarconcini 这是我最近倾向于的观点:-)。这工作正常,直到您遇到嵌套片段和一些陷阱。
-
好吧,嵌套片段是在 hack 之上的 hack,但它们“工作”,有点。 :)
-
我要说的是,片段的加载速度很多比活动快。
标签: java android android-layout android-fragments