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

Не удается переопределить ресурс библиотеки 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.

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

4b9b3361

Ответ 1

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

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

в вашем случае это может быть просто (если вы поместите это в проект не-библиотеки как 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 из своего проекта, и он должен использовать ваш файл, включенный в этот проект, вместо библиотечного.

Ответ 2

[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

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

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

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

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

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

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

Ответ 3

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

Определите 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 в первом случае - факт остается фактом, что идентификатор ресурса не может быть заменен...)

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