Как переопределить чертежи, определенные в проекте библиотеки Android?

У меня есть два приложения для Android с аналогичной функциональностью, но разными чертежами и макетами.

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

Я создал приложение, которое ссылается на библиотеку. Я скопировал все ресурсы из библиотеки в приложение и изменил некоторые чертежи. Я также изменил некоторые строковые ресурсы. Когда я просматриваю один из измененных макетов в редакторе макетов в Eclipse, я вижу правильные переопределенные изображения.

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

Я также внес изменения в некоторые ресурсы макета (переместил и изменил размер некоторых изображений). Когда я запускаю действие, которое использует измененный макет (действие, исходный код которого находится в библиотеке), я вижу новый макет (приложения) со старыми (библиотекой) чертежами.

Я попытался определить чертежи ImageView двумя способами:

  1. в макете xml: android:src="@drawable/image_id"

  2. в коде действия:

    ImageView view = (ImageView)findViewById(R.id.viewId);
    view.setImageResource(R.drawable.image_id);
    

В обоих случаях изображение, которое я вижу, взято из ресурсов проекта библиотеки, а не приложения.

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

Я делаю что-то неправильно?


person Eran    schedule 21.05.2012    source источник
comment
Я проголосовал за ваш вопрос, потому что он кажется очень полезным, особенно с вашим собственным ответом, представленным в комментариях. Я думаю, что переопределение рисунков является таким же важным подходом, как и переопределение методов, и значительно упрощает и упрощает работу. Нет необходимости в каких-либо лишних параметрах и кодировании.   -  person Stan    schedule 20.06.2012


Ответы (3)


Исходя из моего опыта, вы можете заменить ресурс drawable в библиотечном модуле, используя стиль и refs.xml.

Сначала вам нужно объявить доступный ресурс в стиле, например

<style name="drawable_base_style">
    <item name="android:src">@drawable/base</item>
</style>

затем в приложении (модуле или проекте, в зависимости от вашей IDE) переопределите стиль

<style name="drawable_base_style_app">
    <item name="android:src">@drawable/app</item>
</style>

и используйте refs.xml, чтобы указать новый стиль.

<item name="drawable_base_style" type="style">@style/drawable_base_style_app</item>

затем последний шаг: скрестить пальцы.

person Zephyr    schedule 07.05.2015
comment
Напишите, пожалуйста, в какой файл поместить стиль drawable_base_style_app? Где хранится refs.xml? Компиляция не удалась, поскольку drawable_state_selected_style дублируется. - person CoolMind; 07.09.2018

Не копируйте и не вставляйте вещи, просмотрите свой дизайн, чтобы указать ресурс Drawable в качестве параметра для вашего объекта.

person Snicolas    schedule 21.05.2012

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

person Eran    schedule 20.06.2012
comment
Не уверен, за что минус. Этот ответ действительно решил мою проблему. Иначе я бы не выкладывал это здесь. - person Eran; 04.09.2014
comment
Ваше решение не предоставляет таких подробностей, что вы именно делаете, пока очищаете проекты и перестраиваете их. Вы удаляете какие-то ресурсы руками? Вы выполняете чистую задачу Gradle? - person A. Petrov; 02.12.2016
comment
@StAlex Прошло много времени с тех пор, как я опубликовал это, поэтому я не помню подробностей, но, кажется, я очистил проекты в своей Eclipse IDE и пересобрал их. clean — это операция, которую вы можете выполнять в проекте Eclipse. - person Eran; 02.12.2016