Подтвердить что ты не робот

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

У меня есть настраиваемый элемент управления настройками, в котором я определил несколько атрибутов в значениях /attrs.xml. Чтобы сосредоточиться на разговоре, вот пример атрибутов, которые можно найти в значениях /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, когда они рассматривали библиотеки?

4b9b3361

Ответ 1

Используйте http://schemas.android.com/apk/res-auto

Я нашел это решение, которое было случайно указано в проекте AndroidSVG:

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

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

Ответ 2

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

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

main
   |--- library
  • нет проблем с компиляцией приложения с включенной библиотекой, даже если библиотека содержит стиль. Например, вы можете включить одну из моих библиотек (http://code.google.com/p/tree-view-list-android/). Вы найдете там несколько стилизованных атрибутов (например, разборчивых) и некоторые XML файлы, использующие его в библиотеке. Все компилирует и хорошо работает независимо от того, компилируете ли вы библиотеку самостоятельно или как включенную библиотеку... Так что здесь это выглядит хорошо.....
  • теперь у вас могут возникнуть странные проблемы с компиляцией основного проекта, когда у вас есть ресурсы с тем же именем в библиотеке и главном проекте. Я изначально не понял этого, но теперь я знаю, как это работает. Например, если у вас в вашей библиотеке main.xml, у которого есть android: id = "@+ id/some_id", а затем в вашем основном проекте у вас есть еще один main.xml(без some_id 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" (!) Это действительно выглядит как андроидная команда, но как только вы это знаете, она работает безупречно.

Ответ 3

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

Ответ 4

У меня тоже была та же проблема. Мое приложение не обнаружило XML-проект, стиль xml.

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

Моя библиотека Пакет проектов: com.lib.mylibrary Мой пакет Application Application: 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>

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

Ответ 5

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

Ответ 6

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

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