片段还是支持片段?


125

我正在开发一个支持Android> = 4.0的应用程序。它使用android.app包中的片段。由于我面临着4.0中较旧的片段实现(例如问题)的问题,该问题已在支持库中修复,因此我正在考虑从支持库切换回片段实现,以获得更可靠和一致的实现。

你对这个有什么看法?在为Android 4开发时,您是否正在使用支持库中的片段,即使它们已经可用?


2
这是一个很好的问题(+1是因为它使我感到好奇)。在网络上也没有很好的解释。我正在为我的应用程序使用支持库,我想知道我是不是错了,因为在编译或测试过程中我没有发现任何错误。
JJ86 2013年

2
@animuson brillenheini的答案证明这不是主要基于观点的答案。
OneWorld 2014年

Answers:


90

根据我的经验,在所有Android设备上使用相同的片段实现是一个很大的优势。当状态使用原生片段保存在Android 4.0上时,我无法摆脱所有NullPointerExceptions,而支持库将它们全部消失了。到目前为止,我还看不到这种方法有什么缺点。

因此,现在我对自己的问题的回答是:在为Android 4.x开发时,使用支持库中的片段是一个好主意。支持库已修复了一些错误,这些错误仍然存​​在于较旧的片段实现中,并且经常进行更新,以提供更多错误修复。


11
那么,那时的目的是android.app.Fragment什么?如果您可以在此处添加更多说明,将其添加到您的答案中,我将非常满意。谢谢!
jonstaff

1
@jonstaff原因可能是历史性的。请在那里查看我更新的答案。
brillenheini 2013年

11
为了完整起见,似乎有些支持片段无法做到的事情(例如,即使实际的目标OS支持它,也可以使用进行动画处理objectAnimator)。如果使用ViewPager,则意味着必须使用v13支持库中的适配器,否则不能同时使用viewpager和翻转动画。
GSerg 2014年

5
另请注意,自2014年8月起,v13库无法执行嵌套片段。
Martin Marconcini 2014年

1
为什么Google的家伙为什么选择将V13库用于iosched应​​用github.com/google/iosched/blob/master/android/src/main/java/com/…,他们必须有一些理由
forcewill 2014年

40

坚持使用SupportFragment一段时间的一个重要原因是您无法访问ChildFragmentManager直到API17。支持库将为您提供子片段管理器的支持版本。

如果您的片段包含其他片段,那么这将变得很重要。这在平板电脑应用程序中很常见,具有很高的复杂性,并且/或者您的整体架构是基于选项卡式布局或使用导航抽屉。


21

尽管针对Android 4.0以上版本,但我不得不对必须包含支持库感到沮丧-但似乎官方建议:

Android支持库程序包包含几个可以包含在您的应用程序中的库。这些库中的每一个都支持特定范围的Android平台版本和功能集。

本指南说明了支持库提供的重要功能和版本支持,以帮助您决定应在应用程序中包括哪些功能。通常,我们建议包括v4支持和v7 appcompat库,因为它们支持多种Android版本,并提供用于推荐用户界面模式的API。

http://developer.android.com/tools/support-library/features.html


尽管@brillenheini自己提供了一个答案,但这还是应该被接受的答案。它以最佳的准确性和简洁性回答了这个问题。
Arvindh Mani的

4

恕我直言,如果您只打算为4.0开发,我建议您使用本机库,因为可执行文件会变小。的确,您可能会在早期版本中遇到错误问题,但是我认为,解决这些问题中的大多数应该是微不足道的。另外,如果您在4.0及更高版本上运行,则兼容性库应该映射到本机片段。因此,无论如何,您可能最终不得不面对此类问题。支持库的问题是,您有很多类出现2x(一次出现在支持程序包结构中,一次出现在“本机”程序包结构中),这会使开发变得更加麻烦。

但是,如果您也要发布4.0之前的应用,则支持库周围没有办法。另外,由于使用2.3的所有用户约占38%,因此包含此OS版本可能具有商业意义。在这种情况下,您可以将支持库与Jake Wartons ActionBarSherlock结合使用(或在最终发布后与Google支持的ActionBar库结合使用)。


3
感谢您的回答。因为我需要ViewPager,所以无论如何我都必须包括支持库。此外,支持片段也不会尝试切换到本机实现(如果有)。那就是文档所说的。
brillenheini 2013年

是的,事实是(如@brillenheini所说)要拥有ViewPager,您需要v4,因此即使您仅针对v13 +设备,也可能仍会拥有v4。
索提(Sotti)

我刚刚在我的API 21和应用程序上也发现了这一点(ViewPager需要v4)。Meh:-/
mraviator

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.