【问题标题】:Using Activities from Library projects使用图书馆项目中的活动
【发布时间】:2012-05-11 00:32:09
【问题描述】:

我有一个 Library 项目设置和一个依赖于这个库项目的项目 - 一切都可以正常编译,但我的 Dependent 项目运行良好;

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

我的Library 项目可以作为库项目“取消选中”,并且“picker”活动可以单独运行。以自己的方式运行 Library 项目可以正常运行,没有任何问题。

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

谁能告诉我他们以前是否经历过这种情况?

编辑

手动将Library项目Activity使用的layout.xml复制到依赖项目中,使项目正确打开“picker”Activity。这是必须的吗?!确定不是吗?这进一步让我想知道在 Library 项目中合并/引用来自 R.java 的整数 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

编辑

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

编辑

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

然而,我设法使这个问题断断续续:

我浏览了每个库项目并确保它们都有自己的命名空间(即com.company.library.component1com.company.library.component2 等)。经过几次清理(每个项目都以正确的优先级排序)后,此问题自行解决,但在切换库/不是库以测试组件时最终会再次出现。

【问题讨论】:

  • 你到底在说什么问题?问题中没有明确描述,如果您不能提供更多详细信息,我认为其他人无济于事。对于您在此问题中提到的“问题”,您应该至少发布 Eclipse 中显示的完整错误消息。
  • @yorkw 该错误是常见的NullPointerException,由访问由于未找到指定的布局资源(在findViewById(R.id.whatever) 中)而未找到的视图引起。由于目前问题不明显,我不能给你复制粘贴,不过我会在下次出现时添加它们。
  • 我无法为您提供更多关于您发布的当前详细信息的信息,与此同时,请深入阅读 here。最新版本的 SDK 现在非常健壮,在清理/构建依赖项目时应该正确处理库项目(编译源、合并资源等)。您提到您有多个库项目,您是否有两个级别的库项目依赖,即库项目 1 依赖于库项目 2?
  • 是的,我会给出一个完整的例子,但我有 4 个“独立”库,它们可以独立运行。一个运行两个独立库的依赖库和一个运行一个依赖库和两个其他独立库的依赖库。
  • 查看this link 中红色的重要更改,它解释了关于二级库项目依赖的一些注意事项。例如,如果您有 libA (com.example.liba) 依赖于 libB (com.example.libb) 并在 libA 的某个类中显式使用 import com.example.libb.R;,则它不起作用。作为一种好的做法,不建议在代码中显式使用import com.example.libb.R,因为这不是必需的,并且在清理/构建主项目时,所有资源始终包含在主项目自己的 R 文件中。

标签: android library-project


【解决方案1】:

原因:

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

【讨论】:

  • 这很奇怪。我已经做了很长时间了,从来没有设置过这个命名空间。他们说这是“必须的”,但我从来没有使用过这个命名空间,也从来没有遇到过问题。关于我认为我有问题的自定义首选项。
  • 感谢@yorkw,这肯定解决了custom attributes 的问题。
  • @Graeme 如果问题已排序,那么您应该接受这个答案。
  • @djaqeel 这没有回答问题 - 它回答了不是问题原因的症状之一。
  • 我已经为此答案授予了赏金,因为无论如何我都需要更改自定义属性包。但是,它并没有完全解决问题。
【解决方案2】:

不知道你是如何使用android库的,但是我已经做了很多次了,没有任何问题,所以请阅读下关于使用android库的内容:

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

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

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

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

  5. assets 文件夹不能在库项目中使用。只有在实际运行的android项目上才能使用assets文件夹。 proguard 文件也是如此。

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

  7. 记得在导出应用程序之前运行 lint。它会给你很多警告,但最重要的警告是当你使用太新的函数时,这些函数不能在你的目标 API 范围内运行。这对图书馆很重要,因为如果有多个来源,很容易迷路。

  8. 如果您希望在 android 库上扩展活动,则需要某种方法在它们之间进行传输。我知道的唯一方法是扩展应用程序并让它成为如何为每个活动创建意图的管理者。我认为您可以做其他技巧,但它们可能都与这个相似。

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

【讨论】:

  • 7. library files can be inside the library project , but don't forget to link to them on both projects , even if it doesn't give you any compilation warnings. libs被扫描并编译到adt 17的Library项目中。
  • 你能解释一下#8吗?中间的方法是什么意思?这种方法将驻留在哪里?即 - 谁拥有它?
  • @Bamerza 我的意思是一种在新活动之间切换的方法。我建议这样做的方法是扩展 Application 类,它将为您提供正确的活动去。当然,这取决于您的需求。您也许可以在每个需要转到新活动的活动上放置一个函数,如果需要,它将被覆盖。
【解决方案3】:

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

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

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

这可能会导致间歇性和不同的错误,包括缺少引用、DexOpNullPointerExceptions,具体取决于 R.java 文件被破坏或部分构建的程度以及包之间发生的冲突。

【讨论】:

    【解决方案4】:

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

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

    也许这会对你有所帮助。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多