Указание зависимостей проекта Android (в Eclipse)
У меня есть два проекта 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_horizontalSpacing' в пакете 'se.fnord.android'
Идентификатор ресурса существует в R файле, а attrs.xml содержит проект библиотеки, и если я помещаю код макета и ресурсы непосредственно в проект приложения, все работает нормально. Атрибут layout_horizontalSpacing (и 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", btw, является очищенной версией этого).
Ответы
Ответ 1
Самые ранние версии Android-sdk не поддерживают совместное использование на уровне исходного кода. Вы могли бы добавить ваши файлы .class, а затем добавить их в папку lib/, но это решение не позволяло напрямую использовать исходный код и так же важно не поддерживать совместное использование ресурсов или файлов helpl.
Затем в мае 2010 года Android представил механизм библиотечного проекта. Проект библиотеки структурирован очень похож на обычный Android-проект, но вместо того, чтобы использоваться для создания apk, он служит только для предоставления кода и ресурсов другим проектам. Как и обычный проект, проект библиотеки обычно содержит папки src и res, а также файл AndroidManifest.xml; однако манифест должен быть в основном пустым, за исключением элемента манифеста и атрибута package (больше не верного), теперь вы можете объявлять действия и другие компоненты в манифесте вашего проекта библиотеки). Кроме того, файл project.properties для проекта библиотеки должен содержать свойство:
"android.library=true"
Чтобы сделать ссылку из обычного (apk-production) проекта на проект библиотеки, вам нужно добавить строку "android.library.reference.N" в файл project.properties обычного проекта. Например, если мой основной проект хочет указать на два проекта библиотеки, файл project.properties для основного проекта будет включать следующее:
android.library.reference.1=../LibraryA
android.library.reference.2=../../LibraryB
где../и../../- соответствующие пути от основного проекта к библиотечным проектам (это только пример). Обратите внимание, что этот список ссылок основан на 1 и не должен содержать пробелов или дубликатов. Google хорошо знает, что это не идеальная система, но это разумное решение, совместимое с Ant и Eclipse. Вообще говоря, ваша IDE будет пытаться поддерживать эти файлы для вас, но иногда вам может понадобиться отредактировать их вручную.
Сначала проекты библиотеки не поддерживали следующее:
- Библиотечные проекты, указывающие на другие проекты библиотеки
- Библиотечные проекты, содержащие вспомогательные файлы
- Библиотечные проекты, содержащие папку с ресурсами
Однако последующие выпуски sdk решают все эти проблемы.
Для получения дополнительной информации о библиотечных проектах см. официальную документацию.
Ответ 2
Экспортировать проект как JAR - это неправильный способ связать проект библиотеки с проектом приложения через Properties → Java Build Path → Library.
Не нужно связывать проект как необходимый проект через "Свойства" → "Путь сборки Java" → "Проекты".
Прежде всего, прочитайте тему проектов библиотеки в Android-разработчиках → Разработка → Управление проектами: http://developer.android.com/guide/developing/projects/index.html#LibraryProjects
После этого снова прочитайте раздел "Настройка проекта библиотеки" и "Обращение к темам проекта библиотеки" в Android Developers → Разработка → Управление проектами → Из Eclipse с ADT
Итак... шаги:
- Создайте свой проект библиотеки как проект Android;
- Установить "библиотека" в свойствах проекта → Android Создать свое приложение
проект обычно;
- Добавьте ссылку на свою библиотеку в свойствах проекта → Android → Добавить.
После этого вы можете использовать все классы, компоненты (действия, службы, поставщики, получатели), ресурсы и т.д.
Например: для ссылки на любые ресурсы в макете xml, например, вы должны использовать @mylib: id/my_id или @mylib: layout/my_lib_layout
Примечание. Если вы используете компоненты вашей библиотеки в проекте приложения, вы должны реплицировать их в манифесте приложения.
Ответ 3
Кроме того, я получил атрибуты, работающие, но не так, как должно работать, я думаю.
Вы должны использовать в качестве пространства имен элемент, который использует ваши пользовательские атрибуты, пространство имен основного приложения, а не проект библиотеки. Итак, в вашем примере, если вы указали для значения "xmlns: fnord" пространство имен вашего проекта приложения, оно работает.
Кроме того, при чтении пользовательских атрибутов в пользовательском конструкторе PredicateLayout(Context,AttributeSet)
вы должны указать пространство имен приложений, а также при вызовах attributes.getAttributeValue()
.
Какая боль, поскольку этот код находится в вашем приложении библиотеки, который не должен/не должен знать о проекте приложения, в котором он используется. Я работал вокруг этого, получив вызов приложения статическим методом ViewUtil.setAttributeNamespace( appNamespace) в моем приложении onCreate(), и пользовательские представления библиотеки используют это пространство имен для извлечения пользовательских атрибутов. Файл attrs.xml также может оставаться в проекте библиотеки. Теперь единственное уродство в том, что XML-макет должен использовать пространство имен приложений в пользовательских представлениях, поэтому вы не можете поместить эти макеты XML в проект библиотеки.
Ответ 4
Экспортируйте проект библиотеки как JAR и ссылайтесь на него в своем проекте приложения "Java Build Path" как JAR.
Ответ 5
"Экспортировать вашу библиотеку в качестве jar-решения" работает только в том случае, если проект библиотеки содержит только исходный код. В этом случае в вопросе OP упоминается, что его проект библиотеки содержит связанные с ui файлы.
У нас есть то же самое, что и моя команда, желающая иметь библиотечные проекты, которые содержат ui-родственный источник и ресурсы. Мы завершили капитальный ремонт нашей системы сборки Ant, чтобы приложения охватывали проекты библиотеки во время сборки. К сожалению, решение такого типа, похоже, не совместимо с Eclipse, и это серьезный источник разочарования для разработчиков. Мы все еще можем использовать Eclipse, но нам нужно прыгать через обручи, чтобы заставить его работать, и приходится мириться с уменьшенной производительностью.