我已经为Android开发了几个月了,这个问题一次又一次地出现:添加全新功能(API)以支持库的动机是什么,如果没有它们在标准SDK中可用?
示例:
FragmentTabHost API仅可通过android.support.v4.app.FragmentTabHost
获得。大部分时间都很好,但是如果你想一起使用片段嵌套和PreferenceFragment,你就会死在水中 - 筑巢需要你切换到android.support.v4.app.Fragment
(对于4.2以下的支持) ),但是在这个支持lib中没有PreferenceFragment的实现。因此,您要么实现自定义解决方法,要么使用已经实现它们的第三方库(请参阅this question)
编辑:正如@eugen在他的回答中指出的那样,我自己从support-v13引用了FragmentTabHost,它支持本机片段。但是,此信息不会改变整体问题。事实上,如果我将此API与片段嵌套一起使用,我的应用程序今天将无法在~30%的设备上运行(本机片段支持从4.2开始嵌套)。
示例:
我今天遇到的另一个问题(浪费了太多时间)是通过android.support.v7.app.ActionBarDrawerToggle
提供的ActionBarDrawerToggle。我想使用此功能,因此我将整个com.android.support:appcompat-v7:21.0.+
添加到项目的依赖项中。我猜这会做,但我错了 - 我的应用程序没有编译(缺少支持库引用的资源)。在尝试了一些网络技巧后,我发现this question最终提供了解决方案。简而言之:v7支持库依赖于SDK,因此我必须定义compileSdkVersion 21
。
后果:
现在,我告诉自己:FragmentTabHost尚未添加到任何SDK版本中,这意味着即使是4到5年后开发人员仍会继续使用support-v4 lib来提供此功能(因为即使今天添加了这个API,你可以安全地假设所有目标设备本地支持它需要几年时间,对吧?相同的参数适用于android.support.v4.widget.DrawerLayout
以及仅在支持库中出现的其他API。
如果开发人员多年来一直使用支持库,这也意味着他们在这些问题已经解决之后很久就会遇到上述不一致/依赖问题,对吗?
问题:
Google为什么要永远保留这些库?如果所有新API都与兼容库并行添加到SDK中,那么对所有人来说都会更好,这样兼容性库可能会老化并且退休"在某些时候?
编辑:关注@ eugen的回答我现在更加困惑 - 一些API" evolve"使用较新的支持库,但不要将其转换为主SDK(如FragmentTabHost,它从support-v4演变为support-v7)。不将它们添加到SDK中的原因是什么?
答案 0 :(得分:7)
FragmentTabHost API仅可通过android.support.v4.app.FragmentTabHost获得。
不正确的。您提供的链接会导致android.support.v13.app.FragmentTabHost
(与android.support.v4.app.FragmentTabHost
相对)与原生 Fragment
一起使用,但使API 13以上的API可用API 13 。
简而言之:v7支持库依赖于SDK,因此我不得不定义compileSdkVersion 21。
当然,该库的第21版需要第21版工具和第21版SDK。 始终使用相应版本的构建工具,编译SDK和支持库!
截至今天,建议使用这些值:
compileSdkVersion 22
buildToolsVersion '22.0.1'
targetSdkVersion 22
compile 'com.android.support:support-v4:22.0.0'
compile 'com.android.support:appcompat-v7:22.0.0' // includes support-v4
compile 'com.android.support:support-v13:22.0.0' // includes support-v4
现在,我告诉自己:FragmentTabHost尚未添加到任何SDK版本中,这意味着即使是4到5年后,开发人员仍将继续使用support-v4 lib来提供此功能(因为即使这个API也是如此)今天增加了,你可以花几年时间才能安全地假设所有目标设备本地支持它,对吧?
这意味着如果使用support-v13
库实现它,则无需担心。它将起到API 13的作用。
了解上面support-v4
和support-v13
之间的差异。
Google为什么要永远保留这些库?
因为您很可能希望支持较旧的平台。这意味着您需要一个支持库。
即使现在,您使用ActionBarActivity
中的appcompat-v7
(最初打算将操作栏反向到API 7)与minSdkVersion 14
一起使用,因为您需要该材质设计反向移植。这也意味着你被支持片段困住,因为ActionBarActivity
正在使用它们。
如果所有新API都与兼容库并行添加到SDK中,那么每个人都不会更好,这样兼容性库可能会老化并在某些时候“辞职”吗?
支持图书馆年龄。您可能已经注意到recyclerview-v7
(以及其他最近的安卓库)自API 7起可用而不是API 4.您可能还注意到RecyclerView
不在本机SDK中。为什么要将它添加到原生SDK中,只有当你可以推出一个支持库使其可供所有人使用时,它才可用于最新平台?