Проект библиотеки 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, когда они рассматривали библиотеки?
Ответы
Ответ 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"