Проект библиотеки Android использует declare-styleable, как компилировать?

У меня есть элемент управления пользовательскими настройками, для которого я определил несколько атрибутов в values/attrs.xml. Просто чтобы сфокусировать разговор, вот пример атрибутов, которые можно найти в values/attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyCustomView">
        <attr name="android:text"/>
        <attr name="android:textColor"/>            
        <attr name="extraInformation" format="string" />
    </declare-styleable>
</resources>

Чтобы использовать атрибуты, вы используете тег xmlns там, где вы хотите его использовать, и он выглядит примерно так:

xmlns:custom="http://schemas.android.com/apk/res/com.conundrum.app.lib"

В этом и заключается проблема: определение xmlns ссылается на имя пакета БИБЛИОТЕКИ, и этот ресурс отлично компилируется в проекте БИБЛИОТЕКИ. Однако проект Android, включающий проект библиотеки, имеет другое имя пакета, и Android пытается объединить все ресурсы. Когда дело доходит до этого определения xmlns, оно отказывается, потому что имя пакета во включающем проекте Android отличается.

У кого-нибудь есть идеи по использованию ссылок xmlns в проектах библиотеки, которые все еще действительны, включая проекты Android?

Были ли declare-styleables просто недосмотром команды Android, когда они рассматривали библиотеки?


person jkschneider    schedule 24.06.2011    source источник
comment
Работает ли это, если пакет lib находится в пакете приложения, то есть пакет приложения — com.conundrum.app, а классы lib — в com.conundrum.app.lib? И пробовали ли вы использовать полные теги имен классов в своих файлах макетов вместо префиксов?   -  person manmal    schedule 26.06.2011
comment
Мои имена пакетов в настоящее время такие, как вы рекомендуете. Проблема в том, что вы действительно не можете использовать полное имя класса, так как пакет отличается в зависимости от перспективы разработчика (независимо от того, находитесь ли вы в настоящее время в проекте библиотеки или проекте Android). Кроме того, в этом случае я использую ссылку xmlns в файле настроек, а не в макете.   -  person jkschneider    schedule 28.06.2011


Ответы (6)


Используйте 1_

Я нашел это решение случайно представленным в виде примечания в проекте AndroidSVG:

В сторону: обратите внимание на специальный URL-адрес схемы в пространстве имен. Если бы вы использовали пользовательский вид из своего собственного проекта, вы бы использовали URL-адрес на основе имени вашего пакета. Например, http://schemas.android.com/apk/res/com.example.customview. Но поскольку пользовательский вид находится во включенной библиотеке, вы должны использовать ярлык res-auto. Реальный URL-адрес схемы будет автоматически вставлен при создании вашего приложения.

(Я исправил опечатку - отсутствует подпапка /res/ - в приведенном выше тексте)

person Abid H. Mujtaba    schedule 04.11.2013

На самом деле я много играл со стилями и библиотеками, и у меня есть следующие наблюдения:

Представьте, что у вас есть проект с основным проектом и включенной библиотекой:

main
   |--- library
  • нет проблем с компиляцией приложения с включенной библиотекой, даже если библиотека содержит стили. Например, вы можете включить одну из моих библиотек ( http://code.google.com/p/tree-view-list-android/ ). Там вы найдете ряд стилевых атрибутов (например, складной) и некоторые XML-файлы, использующие его внутри библиотеки. Все компилируется и работает хорошо, независимо от того, компилируете ли вы библиотеку отдельно или как включенную библиотеку... Так что здесь это выглядит хорошо.....
  • теперь у вас могут возникнуть странные проблемы с компиляцией основного проекта, когда у вас есть ресурсы с одинаковым именем как в библиотеке, так и в основном проекте. Сначала я этого не понимал, но теперь знаю, как это работает. Например, если у вас есть в вашей библиотеке main.xml с android:id="@+id/some_id", а затем в вашем основном проекте у вас есть другой main.xml (без идентификатора some_id), тогда R.id.some_id будет будет сгенерирован при компиляции библиотеки, но НЕ будет сгенерирован в основном проекте - это может привести к ошибкам компиляции основного проекта, потому что включенные файлы .java библиотеки, скорее всего, будут использовать R.id.some_id (который будет отсутствовать). Сначала я неправильно понял проблему и попытался получить идентификатор динамически, но в конце концов это было не нужно - достаточно было убедиться, что ваши XML-файлы макета в библиотеке используют какое-то частное пространство имен.
  • а теперь самое интересное - как ссылаться на стилизуемые параметры в layout.xmls проекта? Как вы заметили, следующее не будет работать: xmlns:custom="http://schemas.android.com/apk/res/YOUR_LIBRARY_PACKAGE" Удивительно, но вместо этого работает xmlns:custom="http://schemas.android.com/apk/res/YOUR_MAIN_APP_PACKAGE" (!) Это действительно выглядит как упущение от команды Android, но как только вы это узнаете, оно работает безупречно.
person Jarek Potiuk    schedule 27.06.2011
comment
Ярек, ты близок к проблеме. Я действительно могу использовать объявление xmlns в основном приложении и ссылаться на стильные атрибуты в библиотеке. Но что, если в самой библиотеке есть общий файл настроек или макет, который должен ссылаться на настраиваемые атрибуты? В этом случае в библиотеке необходимо использовать имя пакета библиотеки, но при объединении этого предпочтения или макета в основной проект он больше не компилируется. Кажется, что нет другого способа обойти это, кроме как дублировать любой общий макет или файл настроек, который имеет ссылку на стилизованные атрибуты? - person jkschneider; 28.06.2011
comment
Почему-то у меня в библиотеках такой проблемы нет. Моя библиотека действительно компилируется, когда я обращаюсь к attrs, используя library-package-xmlns. Он не компилируется только в случае, который я описал (когда на идентификаторы ссылается макет, который был затенен в основном проекте). Попробуйте сами и используйте мою библиотеку в своем проекте, и она должна правильно скомпилироваться, даже если у меня в макете main_demo.xml есть ссылка на складной атрибут.... - person Jarek Potiuk; 29.06.2011

Это известная проблема в Android. Исправление ожидается в следующем выпуске (r13) средств разработки.

person Graham Borland    schedule 27.07.2011
comment
И краткий ответ в отчете об ошибке заключается в том, что теперь вы можете использовать: schemas.android.com/apk /res-auto вместо любого другого пространства имен uri, и все это просто работает. - person Damon Smith; 06.05.2014

У меня тоже была такая же проблема. Мое приложение не обнаружило стилизованный XML-проект библиотеки.

Я пробовал это:

Пакет проекта моей библиотеки: com.lib.mylibrary Пакет проекта моего приложения: com.app.myapp

Я пробовал xmlns:custom="http://schemas.android.com/apk/res/com.app.myapp

вместо xmlns:custom="http://schemas.android.com/apk/res/com.lib.mylib

Он работал нормально, т.е. пытаться

xmlns:custom="http://schemas.android.com/apk/res/<your app package>

вместо

xmlns:custom="http://schemas.android.com/apk/res/<your lib project package>

Я получил эту идею здесь

person Mahendran    schedule 15.03.2012

Может быть, немного поздно, но проблема, похоже, исправлена ​​​​в последней (r14) версии инструментов разработчика.

person Mopper    schedule 19.10.2011

Это исправило это для меня. Я также помню, что у меня была эта проблема с Xamarin, и то же самое решение работало для Xamarin.

xmlns:ab="http://schemas.android.com/apk/res-auto"

person DevfoMobile    schedule 05.08.2015