使用图书馆项目的活动

时间:2012-05-01 13:33:13

标签: android library-project

我有一个Library项目和一个依赖于这个库项目的项目 - Everything编译得很好,但是Dependent项目运行正常;

我在使用Library项目中的活动时遇到了间歇性问题。

我的Library项目可以作为库项目“取消选中”,而“选择器”活动可以单独运行。在它自己的权利中运行Library项目可以正常工作,没有任何问题。

当我使用依赖项目中的Library项目(以及“选择器”活动)时,它给出了NullPointerExceptions(或历史上DexOp)错误,指出“选择器”活动不能找到它的资源。

有人可以告诉我他们之前是否经历过这种情况吗?

编辑

layout.xml项目活动使用的Library手动复制到依赖项目会使项目正确打开“选择器”活动。这需要吗?!当然不是吗?这进一步让我想知道合并/引用R.java项目中Library的整数id是否存在问题。

修改

我不确定这是否有任何后果,但我的Library项目之一是不同前端项目中使用的一组自定义视图的包装。

这些自定义视图都有一个Activity,因此可以单独测试它们。

其中一个视图具有自定义属性,这些属性在隔离运行时非常有效。但是,似乎依赖项目没有正确地拉入属性并将它们保留在原始名称空间中,导致导入的布局抛出编译错误:

[2012-05-16 12:07:28 - Project] D:\opt\workspace\CustomGlowList\res\layout\main.xml:14: error: No resource identifier found for attribute 'listId' in package 'com.company.library.glowlist'
[2012-05-16 12:07:28 - Project] D:\opt\workspace\CustomGlowList\res\layout\main.xml:14: error: No resource identifier found for attribute 'type' in package 'com.company.library.glowlist

编辑

通过删除Dependent项目中存在的重复文件名来解决DexOp错误。不确定文件名是问题还是文件内容。

修改

到目前为止,我一直无法找到这个问题的解决方案(虽然@ yorkw的回答肯定有助于xml属性!谢谢)。

我设法让这个问题断断续续:

我已经浏览了每个库项目并确保它们都有自己的命名空间(即com.company.library.component1com.company.library.component2等)。经过几次干净(每个项目按正确的优先顺序排序)后,这个问题会自行解决,但是当切换库而不是库来测试组件时,最终会回来。

5 个答案:

答案 0 :(得分:14)

原因:

Issue 9656: Library projects don't support custom XML attributes for custom classes

解决方案:

升级到最新的SDK& ADT版本(已修复自r17发布以来)并使用http://schemas.android.com/apk/res-auto作为自定义属性的命名空间URI,请参阅Revisions for ADT 17.0.0

  

添加了对库中自定义属性的自定义视图的支持。使用自定义属性的布局必须使用名称空间URI http://schemas.android.com/apk/res-auto,而不是包含应用程序包名称的URI。在构建时,此URI将替换为特定于应用程序的URI。

相关主题:

Help with a custom View attributes inside a Android Library Project

答案 1 :(得分:2)

不确定你是如何使用android库的,但是我已经做了很多次没有任何问题,所以请阅读有关使用android库的下一步:

  1. 为了让android项目使用android库项目,你可以编辑“project.properties”并在那里添加库项目的路径,或者更容易,右击项目(那个使用库项目),选择“android”类别,然后选择“添加”并选择库项目。

  2. 为了让android项目始终打开android库项目,还要选择“java build path” - >“projects”并选择库项目。

  3. 在“project.properties”上,尝试将目标设置为两个项目的相同目标,并设置为您拥有的最新目标(最新版本为15),即使您无法测试这个Android版本的应用程序。

  4. 源文件和所有资源文件(在res文件夹中)都可以在库项目中使用。

  5. 资产文件夹不能在库项目中使用。只有在实际运行的android项目上,才能使用assets文件夹。同样的事情也转到了proguard文件。

  6. 图书馆项目的清单几乎不需要几乎任何东西。有关详情,请参阅此帖子:https://stackoverflow.com/a/10445630/878126。如果您希望能够通过使用它的项目访问库项目上的活动,请不要忘记将它们包含在android项目的清单中(无需在android库的清单中写入它们) )。

  7. 记得在导出应用程序之前运行lint。它会为您提供大量警告,但最重要的警告是当您使用无法在您定位的API范围内运行的新功能时。这对于图书馆很重要,因为如果有多个来源,它很容易迷失。

  8. 如果你想扩展android库上的活动,你需要某种方法来介绍它们。我所知道的唯一方法是扩展应用程序,让它成为如何为每个活动创建意图的经理。我认为你可以做其他技巧,但它们都可能与此类似。

  9. 如果你在android库和android项目上有相同的资源(“res”文件夹上的任何资源),那么android项目中的那个将替换另一个。这有利有弊。请记住,您不能为同一资源使用不同的文件扩展名。

答案 2 :(得分:1)

问题是由于未正确构建和引用的每个R项目中的Library个文件引起的。资源文件是直接从调用项目构建和引用的。

Libraries中的每一个都需要具有AndroidManifest.xml中定义的唯一包。这导致每个资源都在调用项目中的唯一命名空间中与包含Library文件的class jar一起编译。

The <code>R</code> files located in situation

在库和可运行项目之间切换时,问题变得间歇性,因为需要进行clean and build来重新生成这些文件,因为在取消Use as library复选框时,它不会自动完成,其中jar(和java类)不需要同样多的哄骗它们被正确引用,因为库项目在充当Library时引用它们。

这可能导致间歇性且不同的错误,包括缺少引用,DexOpNullPointerException s,具体取决于R.java文件被破坏或部分构建的程度以及冲突是什么在包裹之间取代。

答案 3 :(得分:1)

我有同样的问题,我有一个图书馆项目,它有一些活动。 当我从我的主项目调用库项目的Activity时,布局文件资源没有正确加载到libray项目的活动并且给出“nullpointer异常”或“类无法加载”等等。

解决方案:我注意到在我的Library项目和Main项目中使用了相同的布局文件名。我刚刚重命名了这些活动,它已经解决了。

可能会对你有帮助。

答案 4 :(得分:0)

在Android App项目中引用Library项目时遇到了类似的问题。我从Library项目中删除了R.java文件,因此它再次生成,App获取生成的文件。您应该在应用项目 - &gt; gen-&gt; library_namespace_R.java下看到生成的R.java文件。