Проект библиотеки Android использует декларацию стиля - как скомпилировать? - PullRequest
14 голосов
/ 24 июня 2011

У меня есть пользовательский элемент управления настройками, для которого я определил несколько атрибутов в 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 ссылается на имя пакета LIBRARY, и этот ресурс прекрасно компилируется в проекте LIBRARY.Однако проект Android, который включает проект библиотеки, имеет другое имя пакета, и Android пытается объединить все ресурсы.Когда он добирается до этого определения xmlns, он балансирует, потому что имя пакета отличается во включающем проекте Android.

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

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

Ответы [ 6 ]

9 голосов
/ 28 июня 2011

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

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

main
   |--- library
  • нет проблем с компиляцией приложения с включенной библиотекой, даже если библиотека содержит styleable.Например, вы можете включить одну из моих библиотек (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 (который будет отсутствовать).Сначала я неправильно понял проблему и попытался получить идентификатор динамически, но в конце это не понадобилось - этого было достаточно, чтобы убедиться, что ваш макет xmls в библиотеке использует какое-то приватное пространство имен.
  • и теперь самое интересноечасть - как ссылаться на настраиваемые параметры в 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, но как только вы узнаете это, оно работает безупречно.
6 голосов
/ 04 ноября 2013

Использование http://schemas.android.com/apk/res-auto

Я обнаружил, что это решение дано небрежно как примечание в проекте AndroidSVG :

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

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

5 голосов
/ 28 июля 2011

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

3 голосов
/ 15 марта 2012

У меня тоже была такая же проблема.Мое приложение не обнаружило 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>

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

1 голос
/ 19 октября 2011

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

0 голосов
/ 06 августа 2015

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

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

...