Не удается переопределить ресурс xml библиотеки с ресурсом png в приложении?

У меня есть Android-библиотека MyLib содержащая все, что мне нужно для моего приложения (таргетинг на Android 2.2). Эта библиотека имеет XML-ресурс:

 drawable/main_background.xml 

В моем проекте MyApp приложения я MyLib . Здесь я хочу переопределить определенные ресурсы (например, брендинг). Поэтому я добавил фоновое изображение в MyApp :

 drawable/main_background.png 

Eclipse продолжает давать мне эту ошибку:

 [com.mycom.mylib.myapp] res\drawable\main_background.xml:0: error: Resource entry main_background is already defined. [com.mycom.mylib.myapp] res\drawable\main_background.png:0: Originally defined here. 

Как я могу переопределить ресурс в проекте библиотеки?

Вы не можете просто переопределить идентификатор ресурса (это идентификатор ресурса, который вы переопределяете, а не фактический файл) с файлом с разным расширением в Android SDK. Однако вы можете сделать трюк, вставив в свой проект xml-файл с тем же именем ( main_background.xml ) и правильно заполнив его, чтобы отобразить ваш новый файл ( main_background.png ), который вам нужно переименовать ранее. Весь синтаксис, который вам нужен, описан здесь:

http://developer.android.com/guide/topics/resources/drawable-resource.html

, В вашем случае это может быть просто (если вы поместите это в свой main_background.xml проект как main_background.xml , и у вас есть новый png как main_background_new.png ):

 <?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/main_background_new" /> 

С помощью вышеупомянутого решения вы можете ссылаться на @drawable/main_background из вашего проекта, и он должен использовать ваш файл, включенный в этот проект, вместо библиотечного.

 [com.mycom.mylib.myapp] res\drawable\main_background.xml:0: error: Resource entry main_background is already defined. [com.mycom.mylib.myapp] res\drawable\main_background.png:0: Originally defined here. 

Я не верю, что вы можете иметь одно и то же имя файла даже с разными расширениями. Попробуйте называть png что-то еще.

Теперь я не использовал переопределение, поэтому это кажется странным, поскольку вы ожидаете, что это будет так, как вы переопределите актив. Тем не менее, я думаю, что вы либо получили два актива в своей lib, но и то же самое. И что в вашем проекте может быть хорошо иметь актив с тем же именем. Тем не менее я бы удостоверился, что все в порядке, чтобы иметь разные типы. XML отличается от png, и если вы получаете доступ к ресурсу из кода, вы можете получить ошибки типа.

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

Однако приведенная выше ошибка предполагает, что и main_background.png, и main_background.xml находятся в одном проекте ([com.mycom.mylib.myapp]), который, я считаю, не верен.

дальнейшее чтение

На этой странице описаны различные типы проектов, включая проект библиотеки http://developer.android.com/tools/projects/index.html

Теперь я не знаю, откуда у меня получается впечатление, но, посмотрев снова, он просто не указывает нигде, что вы можете переопределить ресурс, используя то же имя ресурса. Бог знает, почему я думал, что это особенность.

Так что нет, то же самое правило применяется, насколько я могу судить, что ресурсы должны быть названы однозначно даже в библиотечных проектах, иначе сгенерированные идентификаторы ресурсов будут конфликтовать. (Ошибка при получении)

Объясняется, как управляются конфликты ресурсов.

Конфликты ресурсов. Поскольку инструменты объединяют ресурсы проекта библиотеки с проектами зависимого приложения, в обоих проектах может быть определен данный идентификатор ресурса. В этом случае инструменты выбирают ресурс из приложения или библиотеки с наивысшим приоритетом и отбрасывают другой ресурс. При разработке своих приложений имейте в виду, что общие идентификаторы ресурсов, вероятно, будут определены более чем в одном проекте и будут объединены с приоритетом ресурсов из приложения или библиотеки с самым высоким приоритетом.

Система будет использовать ресурс с наивысшим приоритетом, отбрасывая все остальное. Что странно, так это то, что вы думаете, что ошибка компиляции не произойдет, поскольку компилятор должен отбрасывать ресурс. Это заставляет меня поверить, что исходный плакат имел аналогичные активы в том же проекте, а не через lib и проект.

Я нигде не читал, что это на самом деле предназначенная функция. Есть ли ссылки, чтобы сказать иначе? (Комментировать их)

Поэтому одно «решение» этой проблемы, которое я не считаю ответом, следующее:

Определите XML-документ в соответствующей библиотеке (мы назовем его bunny.xml) и ссылаемся на другой xml аналогичного имени (bunny_drawn.xml) с фактическим содержимым, которое будет отображаться.

Затем в целевом проекте переопределите bunny.xml с другим и используйте его вместо ссылки на изображение с другим именем – bunny_image.png

Однако это не решает проблему, во-первых, потому что мы технически не переопределяем png с помощью xml (хотя эффект несколько близок к этому). Во-вторых, поскольку одна из ключевых особенностей переопределяющих ресурсов – они переопределены, то есть они НЕ скомпилированы в APK:

Инструменты гарантируют, что ресурс, объявленный в приложении, получает приоритет и что ресурс в проекте библиотеки не скомпилирован в приложение .apk

Но bunny_drawn.xml все равно будет скомпилирован! Мы можем отбирать вторую точку, не только определяя образ, который нужно заменить в целевом APP, но и заменять старый целевой bunny_drawn.xml пустым xml. (Или, как указал Феникс, вы можете иметь содержимое bunny_drawn.xml внутри bunny.xml в первом случае – факт остается фактом, что идентификатор ресурса не может быть заменен …)

Поэтому мой окончательный вывод заключается в том, что это необходимо представить как ошибку в Инструментах разработчика.

Intereting Posts