2009-02-21 27 views
20

我有两款Android项目,一个“库项目”包含自定义布局,并含有使用该布局的应用程序的“应用程序项目”。指定Android项目的依赖关系(在Eclipse)

除了可视化布局编辑器抛出一个ClassNotFoundException(我认为它是插件中的一个bug)之外,似乎一切都可以构建和执行,但是当我尝试开始利用我定义的属性在xml中的自定义布局,我不能再构建。那是;这个工程:

<?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> 

构建失败,从AAPT的消息:

错误没有发现在包'属性 'layout_horizo​​ntalSpacing' 资源标识符se.fnord.android'

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

到目前为止,我已经尝试通过指定的项目引用标准的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' ,顺便说一句,是一个清理版本this)。

+0

另请参阅http://stackoverflow.com/questions/8581627/android-activity-under-eclipse-adt-with-project-dependencies-failed-resolving-x http://stackoverflow.com/questions/9838069/ jar-file-issue-with-adt-r17 – jfritz42 2012-03-27 21:33:36

回答

19

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

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

"android.library=true" 

为了从一个普通的(APK生产)项目库项目的引用,您需要添加一个“机器人.library.reference.N“行放入普通项目的project.properties文件中。例如,如果我的主要项目要指向两个库项目,我project.properties文件为主营项目将包括以下内容:

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

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

起初库项目不支持以下内容:

  1. 库项目指向其他库项目
  2. 库项目包含AIDL文件
  3. 库项目包含资产的文件夹

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

有关库项目的更多信息,请参阅the official documentation

+1

ADT 0.9.7让我们获得80%的我们想要的东西,但它仍然有这些缺点: (1)库项目无法保存.aidl文件, (2)库项目不能依赖于另一个库项目, ( 3)图书馆项目不能持有资产 – 2010-07-01 01:14:10

+1

(1)自ADT以来无效0.9.8 – neu242 2010-10-08 08:51:30

+1

正确。 SDK Tools Revision 7以及ADT 0.9.8(2010年9月发布)至少和可能的(3)解决问题(1)和(2)。 – 2010-12-16 01:25:22

3

导出库项目作为一个JAR和在应用程序项目的“Java构建路径”作为一个JAR引用它。

3

“导出资料库作为一个罐子”解决方案”只有工作,如果你的库项目只包含源代码。在这种情况下,OP的问题提到了他的图书馆项目包含UI相关的东西。

我们有我的团队想要拥有与ui相关的源代码和资源的图书馆项目也是一样的问题,为了让应用程序在构建期间吞并图书馆项目,我们最终彻底改变了我们的Ant构建系统。是与Eclipse兼容,这是无奈的开发人员的主要来源,我们仍然可以使用Eclipse,但我们必须跳火圈得到它的工作,并不得不忍受与减少的生产力。

+0

查看上面提到的ADT 0.9.7更新 - 它主要解决了这个问题。 – 2010-06-21 21:22:22

8

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

您必须在使用自定义属性的元素中使用名称空间,而不是库项目的名称空间。因此,在您的示例中,如果您为应用程序项目的名称空间指定了“xmlns:fnord”的值,则它可以工作。

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

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

12

将项目导出为JAR不是通过Properties - > Java Build Path - > Library将库项目链接到应用程序项目的正确方法。 既不是通过属性 - > Java构建路径 - >项目将项目链接为所需的项目。

首先,阅读Android开发人员的库项目主题 - >开发 - >管理项目:http://developer.android.com/guide/developing/projects/index.html#LibraryProjects 之后,阅读设置库项目和在Android开发人员再次引用库项目主题 - >开发 - >管理项目 - >使用adt

所以...的步骤是:

  1. 作为Android的项目通常创建库项目;
  2. 在项目属性中设置“is library” - > Android正常创建应用程序 项目;
  3. 在项目属性 - > Android - >添加中添加对您的库的引用。

在此之后,你可以使用所有的类,部件(活动,服务提供商,接收器),资源等

例:在xml配置引用任何资源,例如,你应该使用@mylib:id/my_id或@mylib:layout/my_lib_layout

Obs .:如果您在应用程序项目中使用库的组件,则必须将它们复制到应用程序清单中。