当前位置: 首页 > 知识库问答 >
问题:

为什么AOSP会添加新的API来支持库,而没有将它们添加到SDK中?

欧阳英彦
2023-03-14

我已经为Android开发了几个月了,这个问题一次又一次地出现:在没有标准SDK中提供的情况下,添加全新特性(API)来支持库的动机是什么?

示例:

FragmentTabHost API仅可通过android.support.v4.app.FragmentTabHost使用。大多数情况下都很好,但是如果您想同时使用碎片嵌套和PreferenceFragment,您就会陷入困境--嵌套需要您切换到android.support.v4.app.fragment(用于支持4.2以下的版本),但是在这个支持库中没有PreferenceFragment的实现。因此,您要么实现自定义的变通方法,要么使用已经实现它们的第三方库(请参阅此问题)

示例:

我今天遇到的另一个问题(浪费了太多时间)是通过android.support.v7.app.ActionBarDrawerToggle提供的ActionBarDrawerToggle。我想使用这个功能,因此我将整个com.android.support:appcompat-v7:21.0.+添加到Project的依赖项中。我猜这样就行了,但我错了--我的app没有编译(缺少支持库引用的资源)。在从网上尝试了几个技巧后,我发现了这个问题,最终提供了解决方案。简而言之:v7支持库依赖于SDK,因此我不得不定义compilesdkversion21

后果:

共有1个答案

柳奇思
2023-03-14

FragmentTabHost API仅可通过android.support.v4.app.FragmentTabHost使用。

不正确。您提供的链接指向android.support.v13.app.fragmentTabhost,它(与android.support.v4.app.fragmentTabhost相反)与本机fragments一起工作,但使上面介绍的API自API 13起可用。

简而言之:v7支持库依赖于SDK,因此我必须定义CompilesDKVersion21。

当然,库的第21版需要工具的第21版和SDK的第21版。始终使用相应版本的构建工具,编译SDK和支持库!

目前,html" target="_blank">推荐使用以下值:

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库来提供该功能(因为即使今天添加了这个API,您也需要数年时间才能放心地假设所有目标设备都支持它),对吗?

阅读上面的支持-v4支持-v13之间的区别。

为什么谷歌要永远保留这些库?

因为您很可能希望支持较旧的平台。这意味着您需要一个支持库。

 类似资料:
  • 我有一个通过Interface Builder定义的布局约束视图。由于它们无法暂时停用,我决定通过拨打以下电话有选择地删除它们: 但是,之后约束仍然驻留在视图中。约束。此外,我还希望以编程方式添加约束(同样,因为我无法(取消)激活它们): 对我的方法的任何调用都会导致变量wasAdded的值NO。这也反映在用户界面上,它根本没有改变。 最后,我既不能以编程方式添加约束,也不能删除添加到情节提要的约

  • 我试图在编译AOSP时向Android添加一个预构建的jar。jar的名称是“nxpnfclib.jar”,我将其设置为aosp/prebuilts/misc/common/nxp。我还编写了一个Android.mk: 我想在aosp/packages/apps/settings中使用这个jar,所以我将nxpnfclib添加到aosp/packages/apps/settings/android

  • 问题内容: 我想问为什么我们不必在一段时间内添加try-catch块,而应该在其他例外情况下这样做呢? 我的意思是: 编辑:当我说:很明显会有例外发生时,为什么编译器不禁止这样做呢? 问题答案: 那是因为这是一个 未经检查的 异常。不需要显式声明或捕获它。另请参阅有关该主题的Sun教程。 更新: 通常,您只应抛出一个(最好是javadoc中列出的其子类之一)以表明调用者做错了。即传递一个参数(然后

  • WebSocket 使用一种被称作“Upgrade handshake(升级握手)”的机制将标准的 HTTP 或HTTPS 协议转为 WebSocket。因此,使用 WebSocket 的应用程序将始终以 HTTP/S 开始,然后进行升级。这种升级发生在什么时候取决于具体的应用;可以在应用启动的时候,或者当一个特定的 URL 被请求的时候。 在我们的应用中,仅当 URL 请求以“/ws”结束时,我

  • 我试图在我的MarshmallowAOSP构建中包含一个预构建的谷歌apk(没有。so文件),基于以下链接中的信息: > 在我的供应商/制造商/设备/专有/系统/应用程序中,我创建了一个名为“Testapk”的文件夹。 我在这个'testapk'文件夹中保存了两个文件,apk('testapk.apk')和一个Android.mk文件,其中包含以下说明: LOCAL_PATH:=$(调用my-di