如何覆盖在Android库项目中定义的可绘制图形?

19
我有两个 Android 应用程序,具有类似功能但不同的 drawables 和布局。
我想把所有的代码和资源放到一个库项目中,并覆盖那些将引用该库的两个应用程序中的一些可绘制对象和布局。
我创建了一个引用库的应用程序。我将库中的所有资源复制到应用程序中并更改了一些可绘制资源。我还更改了一些字符串资源。当我在 Eclipse 的布局编辑器中查看其中一个已更改的布局时,可以看到正确的重写图像。
当我启动该应用程序时,我看到我在应用程序中更改的字符串资源被正确地显示(库字符串被应用程序的资源覆盖),但我的 ImageView 的可绘制对象都来自库的资源。
我还对一些布局资源进行了更改(移动和调整一些图像)。当我启动使用已更改布局(源代码位于库中)的活动时,我看到新的(应用程序)布局与旧的(库)可绘制对象。
我尝试通过两种方式定义 ImageView 的 drawable:
1. 在布局 xml 中:android:src="@drawable/image_id" 2. 在活动代码中:
ImageView view = (ImageView)findViewById(R.id.viewId);
view.setImageResource(R.drawable.image_id);

在这两种情况下,我看到的图像都来自库项目的资源而不是应用程序。

如果我无法解决这个问题,我将不得不在两个应用程序中复制所有代码,这将是一件遗憾的事情。

我做错了什么吗?


2
我投了你的问题,因为它似乎非常有用,尤其是你在评论中提供的答案。我认为覆盖可绘制对象和覆盖方法一样重要,可以使事情变得更加简单和流畅。不需要任何过多的参数和编码。 - Stan
3个回答

6
根据我的经验,你可以通过使用style和refs.xml来替换库模块中的可绘制资源。
首先,你需要在一个style中声明可绘制资源,例如:
<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>

然后的最后一步:交叉手指。

请问,我们应该将drawable_base_style_app样式放在哪个文件中?refs.xml保存在哪里?编译失败是因为drawable_state_selected_style重复了。 - CoolMind

1
不要复制粘贴,通过检查设计,将Drawable的资源ID作为参数传递给您的对象。

-1

正如我在上面的评论中所写的,我通过清理项目并重新构建它们来解决了我的问题。


2
不确定为什么会被踩。这个答案确实解决了我的问题。否则我也不会在这里发布它。 - Eran
4
您的“解决方案”没有提供足够详细的内容,说明您在“清理项目并重新构建”时具体做了什么。您是手动删除了某些资源吗?还是执行了Gradle的clean任务? - A. Petrov
@StAlex 自从我发布这篇文章以来已经过了很长时间,所以我不记得细节了,但我相信我清理了我的Eclipse IDE中的项目并重新构建了它们。“clean”是您可以在Eclipse项目上执行的操作。 - Eran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接