Указание зависимостей проекта Android (в Eclipse) - PullRequest
21 голосов
/ 21 февраля 2009

У меня есть два проекта 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:

ОШИБКА Не найден идентификатор ресурса для атрибута layout_horizontSpacing в пакете se.fnord.android

Идентификатор ресурса существует в R-файле, и файл attrs.xml содержал проект библиотеки, и если я поместил код макета и ресурсы непосредственно в проект приложения, все работает нормально. Атрибут layout_horizontSpacing (и layout_verticalSpacing) - это пользовательский атрибут, используемый в классе PredicateLayout.LayoutParam для указания расстояния до следующего виджета.

До сих пор я пробовал стандартные способы затмения, указав ссылки на проекты и построив зависимости пути проекта. Мне также сказали попробовать тег в манифесте приложения, который не помог.

Итак, что мне нужно сделать, чтобы ссылки в 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 ).

Ответы [ 5 ]

19 голосов
/ 21 мая 2010

Ранние версии Android SDK не поддерживали совместное использование на уровне исходного кода. Вы можете скопировать файлы .class, а затем добавить их в папку lib /, но это решение не позволяет прямой обмен исходным кодом и, что не менее важно, не поддерживает совместное использование ресурсов или файлов помощи.

Затем, в мае 2010 года, Android представила механизм Library Project. Библиотечный проект по своей структуре очень похож на обычный проект Android, но вместо того, чтобы использовать его для создания apk, он служит только для предоставления кода и ресурсов другим проектам. Как и обычный проект, библиотечный проект обычно содержит папки src и res вместе с файлом AndroidManifest.xml; однако манифест должен быть в основном пустым, за исключением элемента manifest и атрибута пакета (больше не имеет значения true - теперь вы можете объявлять Activity и другие компоненты в манифесте вашего библиотечного проекта). Кроме того, файл project.properties для библиотечного проекта должен содержать свойство:

"android.library=true"

Чтобы сделать ссылку из обычного (производящего apk) проекта на библиотечный проект, вам нужно добавить строку «android.library.reference.N» в файл project.properties обычного проекта. Например, если мой основной проект хочет указать на два библиотечных проекта, мой файл project.properties для основного проекта будет содержать следующее:

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

где ../ и ../../ - это соответствующие пути от основного проекта к проектам библиотеки (это только пример). Обратите внимание, что этот список литературы основан на 1 и не должен содержать пробелов или дубликатов. Google прекрасно понимает, что это не идеальная система, но это было разумное решение, совместимое с Ant и Eclipse. Вообще говоря, ваша IDE попытается сохранить эти файлы для вас, но иногда вам может понадобиться отредактировать их вручную.

Сначала библиотечные проекты не поддерживали следующее:

  1. Библиотечные проекты, указывающие на другие библиотечные проекты
  2. Библиотека проектов, содержащих файлы aidl
  3. Библиотека проектов, содержащих папку активов

Однако последующие выпуски SDK решили все эти проблемы.

Подробнее о библиотечных проектах см. официальная документация .

12 голосов
/ 27 сентября 2011

Экспорт проекта в виде JAR - неправильный способ связать проект библиотеки с проектом приложения через Свойства -> Путь сборки Java -> Библиотека. Также нельзя связать проект как необходимый проект через Свойства -> Путь сборки Java -> Проекты.

Прежде всего, прочитайте тему «Проекты библиотеки» у разработчиков Android -> Разработка -> Управление проектами: http://developer.android.com/guide/developing/projects/index.html#LibraryProjects После этого прочитайте разделы «Настройка библиотечного проекта» и «Ссылки на темы библиотечного проекта» снова на Android Developers -> Разработка -> Управление проектами -> Из Eclipse With ADT

Итак ... шаги:

  1. Создайте свой проект библиотеки как проект Android;
  2. Установите "is library" в свойствах проекта -> Android Создайте свое приложение проект нормально;
  3. Добавить ссылку на вашу библиотеку в свойствах проекта -> Android -> Добавить.

После этого вы можете использовать все классы, компоненты (виды деятельности, услуги, поставщики, получатели), ресурсы и т. Д.

Пример: для ссылки на любые ресурсы в макете XML, например, вы должны использовать @mylib: id / my_id или @mylib: layout / my_lib_layout

Obs .: Если вы используете компоненты вашей библиотеки в проекте приложения, вы должны скопировать их в манифест приложения.

8 голосов
/ 26 октября 2010

Кроме того, я получил атрибуты, работающие, но не так, как они должны работать, я думаю.

Вы должны использовать в качестве пространства имен в элементе, который использует ваши пользовательские атрибуты, пространство имен вашего основного приложения, а не пространство проекта библиотеки. Итак, в вашем примере, если вы укажете для значения «xmlns: fnord» пространство имен вашего проекта приложения, оно будет работать.

Кроме того, при чтении пользовательских атрибутов в пользовательском конструкторе PredicateLayout(Context,AttributeSet) необходимо также указать пространство имен приложения в вызовах attributes.getAttributeValue().

Это неприятно, поскольку этот код находится в приложении вашей библиотеки, который не знает / не должен знать о проекте приложения, в котором он используется. Я обошел это, заставив приложение вызывать статический метод ViewUtil.setAttributeNamespace ( appNamespace) в onCreate () моего приложения, и пользовательские представления библиотеки используют это пространство имен для извлечения пользовательских атрибутов. Файл attrs.xml также может остаться в проекте библиотеки. Теперь единственная неприятная вещь заключается в том, что XML макета должен использовать пространство имен приложения в пользовательских представлениях, поэтому вы не можете поместить эти XML макета в проект библиотеки.

3 голосов
/ 21 мая 2010

Решение «Экспортировать вашу библиотеку в виде jar-файла» работает только в том случае, если ваш библиотечный проект содержит только исходный код. В этом случае в вопросе ОП упоминается, что его библиотечный проект содержит материалы, связанные с пользовательским интерфейсом.

В моей команде точно такая же проблема: мы хотим иметь библиотечные проекты, которые содержат исходные тексты и ресурсы, связанные с пользовательским интерфейсом. В итоге мы переработали нашу систему сборки Ant, чтобы приложения поглощали проекты библиотеки во время сборки. К сожалению, ни одно решение такого рода не совместимо с Eclipse, и это является основным источником разочарования для разработчиков. Мы все еще можем использовать Eclipse, но нам нужно прыгать через обручи, чтобы он заработал, и приходится мириться с уменьшением производительности.

3 голосов
/ 18 марта 2010

Экспортируйте ваш библиотечный проект в виде JAR и укажите его в «Пути сборки Java» проекта вашего приложения в качестве JAR.

...