总是使用 v4 Fragments 而不是内置的 android.app.Fragment?

Posted

技术标签:

【中文标题】总是使用 v4 Fragments 而不是内置的 android.app.Fragment?【英文标题】:Always use v4 Fragments instead of the build-in android.app.Fragment? 【发布时间】:2012-10-15 11:46:50 【问题描述】:

我遇到了ViewPager 和相关的FragmentPagerAdaptor,它们不是常规 android 包的一部分,但仅在 V4 支持包中可用。看来我不能将 FragmentPagerAdaptor 与 android.app.Fragment 一起使用,因为 FragmentPagerAdaptor 需要 v4 FragmentManager 来实例化。阅读 Difference between Activity and FragmentActivity 这似乎是一致的 - 使用 v4 片段和相关类或常规 android.app.Fragments。切勿混合。

更进一步,我认为根本不需要使用常规的 android.app.Fragments,因为它们不如 v4 支持包强大。 (引用另一个问题:The Android Support package is not only for backports of newer APIs. It is also for other classes that, for whatever reason, are not being added to the SDK, such as ViewPager and its supporting classes.)。我能想到的“唯一”缺点是 v4 支持库与 APK 捆绑在一起,这意味着我的应用将占用更多空间。

我是否应该始终使用 v4 支持库来支持片段,因为它们包含更多功能? (而且它们是向后兼容的,不要忘记。)

【问题讨论】:

【参考方案1】:

我刚刚意识到可以同时使用android.app.Fragmentandroid.support.v4.view.ViewPager...如果您使用android.support.v13.app.FragmentPagerAdapter... 所以看来v13 支持包解决了/改进了 android.app.Fragment 和android.support.v4.view.ViewPager 之间的兼容性问题。真是一团糟。

虽然这解决了我想出的特定示例,但我仍然想知道最好的选择是否总是在 v4 类可用时使用它们,而不是内置类(例如 android. app.Fragment),即使我只担心 ICS 和更新的设备?

【讨论】:

如果您只担心 ICS 及更高版本,请使用较新的片段。向后兼容的是有限的,因为它们是为支持旧版本而设计的。此外,如果您已经回答了自己的问题,请务必接受您的回答,以便其他人可以从您的信息中受益。 我多次从 Google 工程师 (@IO+DevBytes) 那里听到,即使我们的 minSdk 为 14 (Android 4.0) 或更高版本,我们也应该使用 compat 库。为什么?因为他们可以比 Android 操作系统在设备上更频繁地更新支持库。 (@Intrications 指出错误的版本号后编辑的评论 - thx) @ZsoltSafrany,你有指向这些特定 DevBytes 或 IO sn-ps 的链接吗?【参考方案2】:

就向后兼容性而言,确实使用 v4 支持包版本是最好的方法。

随着设备转向内置功能的操作系统,使用 SDK 版本可能会变得更容易,因为支持包中的所有功能都将包含在 SDK 中。

目前,坚持使用 v4 为 2.2/2.3 设备提供支持,这些设备仍然占据 Android 设备市场的很大份额

【讨论】:

我同意 v4 为旧设备提供支持是一个巨大的好处。然而问题恰恰相反。即使世界上每个人都有基于 ICS 的(或更新的)设备,我也不明白为什么我应该使用 android.app.Fragment 而不是 V4 Fragment 版本。原因是 v4 支持库包含更多功能。

以上是关于总是使用 v4 Fragments 而不是内置的 android.app.Fragment?的主要内容,如果未能解决你的问题,请参考以下文章

Fragments的初识---不知道Fragments的不是合格的android开发

Fragments 中的成员变量与 setArguments

ViewPager 片段随着时间的推移而被破坏?

NSFetchedResultsController 总是返回 NSManagedObject 对象而不是自定义

从 v4.Fragment 请求运行时权限并让回调转到 Fragment?

从 v4.Fragment 请求运行时权限并让回调转到 Fragment?