Использование действий в библиотечных проектах
У меня есть проект Library
и проект, который зависит от этого проекта библиотеки. Все компилируется отлично, и у меня был проект Dependent
, который работает нормально,
У меня проблема с периодичностью, но при использовании Activity из проекта Library
.
Мой проект Library
может быть "не отмечен" как проект библиотеки, а "сборщик" может выполняться изолированно. Выполнение проекта Library
в его собственном праве отлично работает без проблем.
Когда я использую проект Library
(и действие "picker" ) из зависимого проекта, он дает мне либо ошибки NullPointerExceptions
(или исторически DexOp), что активность "сборщика" не может найти ресурсы.
Может ли кто-нибудь сказать мне, если они испытали это раньше?
EDIT
Вручную копирование layout.xml
, используемого в проекте проекта Library
для зависимого проекта, заставляет проект правильно открыть "сборщик". Это необходимо?! Неужели нет? Это еще больше заставляет меня задаться вопросом, существует ли проблема с объединением/ссылкой на целочисленный идентификатор из R.java
в проекте Library
.
ИЗМЕНИТЬ
Я не уверен, что это имеет какое-то значение, но один из моих проектов Library
- это оболочка вокруг набора пользовательских представлений, используемых в разных проектах переднего плана.
Эти пользовательские представления имеют активность, чтобы их можно было тестировать изолированно.
В одном из этих представлений есть пользовательские атрибуты, которые при работе в изоляции работают очень хорошо. Однако, похоже, что зависимый проект правильно втягивает атрибуты и сохраняет их в своем исходном пространстве имен, заставляя импортированный макет выдавать ошибки компиляции:
[2012-05-16 12:07:28 - Project] D:\opt\workspace\CustomGlowList\res\layout\main.xml:14: error: No resource identifier found for attribute 'listId' in package 'com.company.library.glowlist'
[2012-05-16 12:07:28 - Project] D:\opt\workspace\CustomGlowList\res\layout\main.xml:14: error: No resource identifier found for attribute 'type' in package 'com.company.library.glowlist
EDIT
Ошибки DexOp были решены путем удаления дублированного имени файла, которое присутствовало в проекте Dependent
. Не уверен, что имя файла было проблемой или содержимым файла.
ИЗМЕНИТЬ
Я пока не смог найти решение этой проблемы (хотя ответ @yorkw, безусловно, помогает с атрибутами xml!).
Однако мне удалось сделать эту проблему прерывистой:
Я прошел через каждый из проектов библиотеки и гарантировал, что у всех у них есть собственное пространство имен (т.е. com.company.library.component1
, com.company.library.component2
и т.д.). После нескольких чистых (каждый проект упорядочен с правильным приоритетом) эта проблема решает сам, однако в конечном итоге возвращается при переключении библиотеки/не библиотеки для тестирования компонентов.
Ответы
Ответ 1
Проблема вызвана файлами R
из каждого из проектов Library
, которые неправильно создаются и ссылаются. Файлы ресурсов создаются и ссылаются непосредственно на вызывающий проект.
Каждый из Libraries
должен иметь уникальный пакет, определенный в AndroidManifest.xml
. Это приводит к тому, что каждый из этих ресурсов компилируется в этом уникальном пространстве имен в вызывающем проекте вместе с банком Library
, который содержит файлы class
.
![The <code>R</code> files located in situation]()
При переключении между библиотекой и исполняемым проектом проблема становится прерывистой, так как требуется clean and build
для регенерации этих файлов, поскольку она не выполняется автоматически при снятии флажка Use as library
, где в качестве баннера (и java классы) не требуют такого многого уговоров, чтобы их правильно ссылали, поскольку проекты библиотек ссылаются на них, действуя как Library
.
Это может привести к прерывистым, а также переменным ошибкам, включая отсутствующие ссылки, DexOp
и NullPointerException
в зависимости от того, в какой степени файлы t211 были искалечены или частично построены и какие конфликты происходят между пакетами.
Ответ 2
Причина:
Проблема 9656: Библиотечные проекты не поддерживают пользовательские атрибуты XML для пользовательских классов
Решение:
Обновление до последней версии SDK и ADT (исправлено было выпущено с r17) и использовать http://schemas.android.com/apk/res-auto
как URI пространства имен пользовательских атрибутов, см. Версия для ADT 17.0 +0,0:
Добавлена поддержка пользовательских представлений с пользовательскими атрибутами в библиотеках. Макеты с использованием настраиваемых атрибутов должны использовать URI пространства имен http://schemas.android.com/apk/res-auto вместо URI, который включает имя пакета приложения. Этот URI заменяется конкретным приложением во время сборки.
Связанная тема:
Справка с настраиваемыми атрибутами View в проекте библиотеки Android
Ответ 3
не уверен, как вы используете библиотеку android, но я делал это много раз без каких-либо проблем, поэтому, пожалуйста, прочитайте следующее о использовании библиотек Android:
-
чтобы проект android использовал проект андроидной библиотеки, вы можете отредактировать "project.properties" и добавить туда путь к проекту библиотеки или, что намного проще, щелкнуть правой кнопкой мыши проект использует проект библиотеки), выберите категорию "android" и выберите "добавить" и выберите проект библиотеки.
-
чтобы проект android всегда открывал проект библиотеки Android, также выберите "путь сборки Java" → "проекты" и выберите проект библиотеки.
-
в "project.properties", постарайтесь установить цель для одной и той же цели для обоих проектов, а также для новейшей версии (последняя сейчас 15), даже если вы не можете проверить приложение на эту версию для Android.
-
исходные файлы и все файлы ресурсов (в папке res) одобрены для использования в проектах библиотеки.
-
Папки активов не могут использоваться внутри проекта библиотеки. только на проекте андроида, который действительно выполняется, можно использовать папку с ресурсами. то же самое относится к файлу proguard.
-
манифест библиотечных проектов почти не нуждается ни в чем. см. это сообщение для получения дополнительной информации: fooobar.com/questions/44798/.... если в проекте библиотеки есть действия, которые вы хотите получить через проект, который его использует, не забудьте включить их в манифест проекта андроида (нет необходимости записывать их в манифесте библиотеки Android).
-
Не забудьте запустить lint перед экспортом приложения. это дает вам много предупреждений, но самое важное предупреждение - когда вы используете слишком новые функции, которые не могут работать в диапазоне API-интерфейсов, на которые вы нацеливаетесь. это важно для библиотек, поскольку легко потеряться, если есть несколько источников.
-
если вы хотите расширить действия в библиотеке Android, вам нужен какой-то метод для перехода между ними. единственный способ, которым я знаю, - расширить приложение и позволить ему быть менеджером того, как создать намерение для каждого из видов деятельности. я думаю, вы можете делать другие трюки, но все они, вероятно, похожи на этот.
-
если у вас есть один и тот же ресурс (любой ресурс в папке "res" ), как в андроидной библиотеке, так и в проекте андроида, тот, который в проекте Android будет заменен другим. это имеет свои преимущества и недостатки. помните, что вы не можете иметь разные расширения файлов для одного и того же ресурса.
Ответ 4
У меня такая же проблема, как у меня есть один проект библиотеки, и у меня есть активность.
Когда я вызывал проект проекта библиотеки из моего основного проекта, ресурсы файлов макетов не загружались должным образом для деятельности проекта libray и давали "исключение nullpointer" или "класс не мог быть загружен" и т.д.
Решение. Я заметил, что то же имя файла макета используется в моем проекте "Библиотека" и "Основной проект". Я только что переименовал эту деятельность и решил.
Возможно, это поможет вам.
Ответ 5
У меня была аналогичная проблема при ссылке на проект библиотеки внутри проекта Android App. Я удалил файл R.java из проекта библиотеки, чтобы он снова сгенерировался, и приложение подобрало сгенерированный файл. Вы должны увидеть сгенерированный файл R.java в вашем проекте project- > gen- > library_namespace_R.java.