片段还是支持片段?
Posted
技术标签:
【中文标题】片段还是支持片段?【英文标题】:Fragment or Support Fragment? 【发布时间】:2013-06-25 10:56:59 【问题描述】:我正在开发一个支持 android >= 4.0 的应用。它使用来自android.app
包的片段。由于我面临 4.0 中较旧的片段实现的问题,例如 this one,这些问题已经在支持库中修复,我正在考虑从支持库切换回片段实现以获得更可靠和一致的实现。
您对此有何看法?在为 Android 4 开发时,您是否使用了支持库中的片段,即使它们已经可用?
【问题讨论】:
这是一个很好的问题(+1,因为它让我很好奇)。对此,网络上也没有很好的解释。我正在为我的应用程序使用支持库,我想知道我是否错了,因为我在编译或测试期间没有注意到任何错误。 @animuson brillenheini 的回答证明这不是一个主要基于意见的回答。 【参考方案1】:根据我的经验,在所有 Android 设备上使用相同的片段实现是一个很大的优势。当使用本机片段在 Android 4.0 上保存状态时,我无法摆脱所有 NullPointerExceptions,支持库它们都消失了。到目前为止,我也看不出这种方法有任何缺点。
所以我现在对自己的问题的回答是:在为 Android 4.x 开发时,使用支持库中的片段是一个好主意。支持库修复了旧片段实现中仍然存在的错误,并且经常更新以修复更多错误。
【讨论】:
那么android.app.Fragment
的目的是什么?如果您可以将其添加到您的答案here 中并提供更多解释,我将完全满意。谢谢!
@jonstaff 原因可能是历史性的。请在那里查看我的更新答案。
为了完整起见,似乎有些事情支持片段不能做(例如being animated with objectAnimator
,即使实际目标操作系统支持它)。如果您使用ViewPager
,则意味着您必须使用来自 v13 支持库的适配器,否则您不能同时拥有 viewpager 和翻转动画。
另外要小心,截至 2014 年 8 月,v13 库不能做嵌套片段。
为什么 google 的人选择使用 v13 库作为 iosched 应用程序 github.com/google/iosched/blob/master/android/src/main/java/com/… ,他们一定有一些原因【参考方案2】:
暂时坚持使用SupportFragment
的一个重要原因是,在 API 17 之前您无法访问ChildFragmentManager
。支持库将为您提供子片段管理器的支持版本。
如果您有包含其他片段的片段,这将变得很重要。这在具有大量复杂性和/或您的整体架构基于选项卡式布局或使用导航抽屉的平板电脑应用程序中很常见。
【讨论】:
【参考方案3】:尽管目标是 Android 4.0+,但我也对必须包含支持库感到沮丧 - 但它似乎是官方推荐的:
Android 支持库包包含几个库,它们 可以包含在您的应用程序中。这些库中的每一个都支持 特定范围的 Android 平台版本和一组功能。
本指南解释了重要的功能和版本支持 由支持库提供,以帮助您决定您需要哪些 应包含在您的应用程序中。 一般来说,我们建议包括 v4 支持和 v7 appcompat 库,因为它们支持广泛的 Android 版本范围并为推荐用户提供 API 界面模式。
http://developer.android.com/tools/support-library/features.html
【讨论】:
这应该是公认的答案,尽管@brillenheini 自己提供了答案。它以最准确和简洁的方式回答了问题。【参考方案4】:恕我直言,如果您打算仅针对 4.0 进行开发,我建议您使用本机库,因为可执行文件会变得更小。确实,您可能会在早期版本中遇到错误问题,但我认为其中大多数应该是相当容易解决的。此外,兼容性库应该映射到本机片段,以防您在 4.0 或更高版本上运行。因此,无论如何,您最终可能不得不与这些问题作斗争。 支持库的问题在于您有很多类出现 2x(一次在支持包结构中,一次在“本机”包结构中),这使得开发更加麻烦。
但是,如果您还想发布 4.0 之前的应用程序,则无法绕过支持库。此外,由于大约 38% 的用户使用 2.3,因此包含此操作系统版本可能具有商业意义。在这种情况下,您可以将支持库与 Jake Wartons ActionBarSherlock 结合使用(或在最终发布后与谷歌支持的 ActionBar 库一起使用)。
【讨论】:
感谢您的回答。因为我需要 ViewPager,所以无论如何我都必须包含支持库。此外,如果可用,支持片段不会尝试切换到本机实现。这就是docs 所说的。 是的,问题是(正如@brillenheini 所说)要拥有 ViewPager,您需要 v4,因此即使您只针对 v13+ 设备,您也可能会完成 v4。 我刚刚在我的 API 21 和应用程序上也发现了这一点(ViewPager 需要 v4)。嗯:-/【参考方案5】:现在看来还是用Support Library比较好,因为我在这里看到了https://developer.android.com/reference/android/app/Fragment.html的声明
此类在 API 级别 P 中已弃用。请使用支持库 跨所有设备的一致行为和访问的片段 生命周期。
【讨论】:
以上是关于片段还是支持片段?的主要内容,如果未能解决你的问题,请参考以下文章