Использование действий в библиотечных проектах - программирование
Подтвердить что ты не робот

Использование действий в библиотечных проектах

У меня есть проект 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 и т.д.). После нескольких чистых (каждый проект упорядочен с правильным приоритетом) эта проблема решает сам, однако в конечном итоге возвращается при переключении библиотеки/не библиотеки для тестирования компонентов.

4b9b3361

Ответ 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.