指定Android项目依赖关系(在Eclipse中)

我有两个Android项目,包含自定义布局的“库项目”和包含使用布局的应用程序的“应用程序项目”。

除了可视化布局编辑器抛出一个ClassNotFoundExceptionexception(我认为它是插件中的一个bug)之外,似乎所有东西都可以构build和执行,但是当我尝试开始使用为定制布局定义的属性时XML,我不能再build立。 那是; 这工作:

<?xml version="1.0" encoding="utf-8"?> <se.fnord.android.layout.PredicateLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="asdfasdf" /> </se.fnord.android.layout.PredicateLayout> 

而这并不是:

 <?xml version="1.0" encoding="utf-8"?> <se.fnord.android.layout.PredicateLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:fnord="http://schemas.android.com/apk/res/se.fnord.android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView fnord:layout_horizontalSpacing="1px" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="asdfasdf" /> </se.fnord.android.layout.PredicateLayout> 

构build失败,并从aapt消息:

错误在包'se.fnord.android'中找不到属性'layout_horizo​​ntalSpacing'的资源标识符

资源标识符确实存在于R文件中,attrs.xml包含库项目,如果我将布局代码和资源直接放在应用程序项目中,一切正常。 layout_horizo​​ntalSpacing属性(和layout_verticalSpacing)是在PredicateLayout.LayoutParam类中使用的自定义属性,用于指定到下一个小部件的距离。

到目前为止,我已经通过指定项目引用和构buildpath项目依赖性来尝试标准的Eclipse方法。 我也被告知尝试在应用程序清单中的标签,这没有帮助。

那么,我需要做些什么才能使xml文件中的引用起作用?

我不知道这是否相关,但是“库”清单看起来像这样:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="se.fnord.android" android:versionCode="1" android:versionName="1.0.0"> </manifest> 

“应用程序”的清单是这样的:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="se.fnord.appname" android:versionCode="1" android:versionName="1.0.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".AppName" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

('PredicateLayout',顺便说一句,这是一个清理版本)。

最早版本的Android sdk不支持在源代码级别以一种很好的方式共享。 您可以打开您的.class文件,然后将其添加到lib /文件夹中,但是此解决scheme不允许直接共享源代码,同样重要的是不支持共享资源或aidl文件。

然后在2010年5月,Android引入了Library Project机制。 一个库项目的结构非常类似于一个普通的Android项目,而不是用来生成一个apk,它只是为其他项目提供代码和资源。 就像一个普通的项目一样,一个Library Project通常包含src和res文件夹以及一个AndroidManifest.xml文件; 然而,清单应该大部分是空的,除了manifest元素和包属性(不再是真的 – 现在可以在库项目的清单中声明活动和其他组件)。 另外,库项目的project.properties文件需要包含属性:

 "android.library=true" 

要从一个普通的(apk生成)项目引用到一个库项目,你需要在普通项目的project.properties文件中添加一个“android.library.reference.N”行。 例如,如果我的主项目要指向两个库项目,那么主项目的project.properties文件将包含以下内容:

 android.library.reference.1=../LibraryA android.library.reference.2=../../LibraryB 

其中../和../../是从主项目到图书馆项目的相应path(这只是一个例子)。 注意这个引用列表是基于1的,它不应该包含空格或重复。 谷歌很清楚,这不是一个完美的系统,但它是一个合理的解决scheme,与Ant和Eclipse兼容。 一般来说,您的IDE会尝试为您维护这些文件,但有时您可能需要手动编辑它们。

起初图书馆项目不支持以下内容:

  1. 指向其他图书馆项目的图书馆项目
  2. 包含aidl文件的库项目
  3. 包含资产文件夹的库项目

然而,随后的sdk版本解决了所有这些问题。

有关图书馆项目的更多信息,请参阅官方文档 。

将项目导出为JAR不是通过“属性” – >“Java构buildpath” – >“库”将库项目链接到应用程序项目的正确方法。 通过“属性” – >“Java构buildpath” – >“项目”,将项目作为所需项目链接也不是。

首先,阅读Android开发人员的库项目主题 – >开发 – >pipe理项目: http : //developer.android.com/guide/developing/projects/index.html#LibraryProjects在此之后,阅读设置库在Android开发人员 – >开发 – >pipe理项目 – >从Eclipse使用ADT再次引用项目和引用一个库项目主题

所以……步骤是:

  1. 正常创build您的库项目作为一个Android项目;
  2. 在项目属性 – > Android中设置“is library”正常创build你的App项目;
  3. 在项目属性 – > Android – >添加中添加对库的引用。

在此之后,您可以使用所有类,组件(活动,服务,提供者,接收者),资源等。

例如:要引用xml布局中的任何资源,例如,您应该使用@mylib:id / my_id或@mylib:layout / my_lib_layout

注意:如果您在应用程序项目中使用库的组件,则必须在应用程序清单中复制这些组件。

此外,我得到的属性工作,但不是我应该工作的方式。

您必须在使用自定义属性的元素中使用名称空间,而不是库项目的名称空间。 所以,在你的例子中,如果你指定了“xmlns:fnord”的值,你的应用程序项目的命名空间,它的工作原理。

此外,在读取自定义PredicateLayout(Context,AttributeSet)构造函数中的自定义属性时,还必须在调用attributes.getAttributeValue()指定应用程序的名称空间。

这是一个痛苦,因为代码是在你的图书馆应用程序,它不/应该不知道它使用的应用程序项目。我通过让应用程序调用静态方法ViewUtil.setAttributeNamespace(appNamespace)我的应用程序的onCreate()和库的自定义视图使用该命名空间来检索自定义属性。 attrs.xml文件也可以保留在库项目中。 现在唯一难看的是布局XML必须在自定义视图上使用应用程序的命名空间,所以你不能把这些布局XML放在库项目中。

将库项目导出为JAR,并将其作为JAR引用到应用程序项目的“Java Build Path”中。

“将你的库导出为jar”解决scheme“只在你的库项目只包含源代码时才有效,在这种情况下,OP的问题提到他的库项目包含与ui相关的东西。

对于想要拥有与ui相关的来源和资源的图书馆项目,我们也有同样的问题。 为了使应用程序在构build期间吞并图书馆项目,我们最终修改了我们的Ant构build系统。 不幸的是,这种解决scheme似乎没有与Eclipse兼容,这是开发人员感到沮丧的一个主要原因。 我们仍然可以使用Eclipse,但是我们必须通过努力来实现它,并且不得不忍受生产力的下降。