我有一个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.component1
,com.company.library.component2
等)。经过几次干净(每个项目按正确的优先顺序排序)后,这个问题会自行解决,但是当切换库而不是库来测试组件时,最终会回来。
答案 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库的下一步:
为了让android项目使用android库项目,你可以编辑“project.properties”并在那里添加库项目的路径,或者更容易,右击项目(那个使用库项目),选择“android”类别,然后选择“添加”并选择库项目。
为了让android项目始终打开android库项目,还要选择“java build path” - >“projects”并选择库项目。
在“project.properties”上,尝试将目标设置为两个项目的相同目标,并设置为您拥有的最新目标(最新版本为15),即使您无法测试这个Android版本的应用程序。
源文件和所有资源文件(在res文件夹中)都可以在库项目中使用。
资产文件夹不能在库项目中使用。只有在实际运行的android项目上,才能使用assets文件夹。同样的事情也转到了proguard文件。
图书馆项目的清单几乎不需要几乎任何东西。有关详情,请参阅此帖子:https://stackoverflow.com/a/10445630/878126。如果您希望能够通过使用它的项目访问库项目上的活动,请不要忘记将它们包含在android项目的清单中(无需在android库的清单中写入它们) )。
记得在导出应用程序之前运行lint。它会为您提供大量警告,但最重要的警告是当您使用无法在您定位的API范围内运行的新功能时。这对于图书馆很重要,因为如果有多个来源,它很容易迷失。
如果你想扩展android库上的活动,你需要某种方法来介绍它们。我所知道的唯一方法是扩展应用程序,让它成为如何为每个活动创建意图的经理。我认为你可以做其他技巧,但它们都可能与此类似。
如果你在android库和android项目上有相同的资源(“res”文件夹上的任何资源),那么android项目中的那个将替换另一个。这有利有弊。请记住,您不能为同一资源使用不同的文件扩展名。
答案 2 :(得分:1)
问题是由于未正确构建和引用的每个R
项目中的Library
个文件引起的。资源文件是直接从调用项目构建和引用的。
Libraries
中的每一个都需要具有AndroidManifest.xml
中定义的唯一包。这导致每个资源都在调用项目中的唯一命名空间中与包含Library
文件的class
jar一起编译。
在库和可运行项目之间切换时,问题变得间歇性,因为需要进行clean and build
来重新生成这些文件,因为在取消Use as library
复选框时,它不会自动完成,其中jar(和java类)不需要同样多的哄骗它们被正确引用,因为库项目在充当Library
时引用它们。
这可能导致间歇性且不同的错误,包括缺少引用,DexOp
和NullPointerException
s,具体取决于R.java
文件被破坏或部分构建的程度以及冲突是什么在包裹之间取代。
答案 3 :(得分:1)
我有同样的问题,我有一个图书馆项目,它有一些活动。 当我从我的主项目调用库项目的Activity时,布局文件资源没有正确加载到libray项目的活动并且给出“nullpointer异常”或“类无法加载”等等。
解决方案:我注意到在我的Library项目和Main项目中使用了相同的布局文件名。我刚刚重命名了这些活动,它已经解决了。
可能会对你有帮助。
答案 4 :(得分:0)
在Android App项目中引用Library项目时遇到了类似的问题。我从Library项目中删除了R.java文件,因此它再次生成,App获取生成的文件。您应该在应用项目 - > gen-> library_namespace_R.java下看到生成的R.java文件。