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

时间:2009-02-21 19:11:18

标签: android eclipse dependencies

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

除了可视布局编辑器抛出ClassNotFoundException(我认为是插件中的错误)之外,所有内容似乎都构建并执行正常,但是当我尝试开始使用我为其定义的属性时在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的消息:

  

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

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

到目前为止,我已经通过指定项目引用和构建路径项目依赖项来尝试标准的eclipse方法。我还被告知要在应用程序清单中尝试标记,但没有帮助。

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

我不知道它是否相关,但'library'清单看起来像这样:

<?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的清理版本。)

5 个答案:

答案 0 :(得分:19)

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

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

"android.library=true"

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

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

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

起初,Library Projects不支持以下内容:

  1. 指向其他图书馆项目的图书馆项目
  2. 包含aidl文件的图书馆项目
  3. 包含资产文件夹的图书馆项目
  4. 然而,随后的sdk版本解决了所有这些问题。

    有关图书馆计划的更多信息,请参阅the official documentation

答案 1 :(得分:12)

将项目导出为JAR不是通过Properties - &gt;将库项目链接到您的应用项目的正确方法。 Java构建路径 - &gt;图书馆。 也不是通过Properties - &gt;将项目链接为必需的项目。 Java构建路径 - &gt;项目

首先,阅读Android开发人员的图书馆项目主题 - &gt;开发 - &gt;管理项目:http://developer.android.com/guide/developing/projects/index.html#LibraryProjects 在此之后,请在Android开发者处再次阅读设置库项目和再次引用库项目主题 - &gt;开发 - &gt;管理项目 - &gt;来自Eclipse with ADT

所以......步骤是:

  1. 通常将您的图书馆项目创建为Android项目;
  2. 在项目属性中设置“is library” - &gt; Android创建您的应用程序 项目正常;
  3. 在项目属性中添加对库的引用 - &gt; Android - &gt;添加。
  4. 在此之后,您可以使用所有类,组件(活动,服务,提供者,接收者),资源等。

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

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

答案 2 :(得分:8)

另外,我认为属性有效,但我认为它不应该起作用。

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

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

这很痛苦,因为该代码在您的库应用程序中,它不会/不应该知道它所使用的应用程序项目。我通过让应用程序调用静态方法ViewUtil.setAttributeNamespace来解决这个问题。我的应用程序的onCreate()中的appNamespace,并且库的自定义视图使用该命名空间来检索自定义属性。然后,attrs.xml文件也可以保留在库项目中。现在唯一令人遗憾的是布局XML必须在自定义视图上使用应用程序的命名空间,因此您不能将这些布局XML放在库项目中。

答案 3 :(得分:3)

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

答案 4 :(得分:3)

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

我的团队想要拥有与ui相关的源和资源的图书馆项目,我们有完全相同的问题。我们最终彻底改造了我们的Ant构建系统,以便在构建期间让应用程序吞没库项目。不幸的是,没有这种解决方案似乎与Eclipse兼容,这是开发人员感到沮丧的主要原因。我们仍然可以使用Eclipse,但我们必须通过箍来使其工作并且不得不忍受降低的生产力。