我已经开发了几个Android应用程序,并创建了一个我经常在多个应用程序中使用的类的代码库。此代码全部位于Subversion(svn)存储库中,每个应用程序位于其自己的存储库中。然后每个应用程序都有svn:所需软件包的外部引用(例如,com.company.android.views)。除非需要为自定义属性导入R类,否则这很有用。跨Android应用程序使用的自定义视图和属性
定制视图具有像这样的导入:
import com.company.apps.myapp.R
,以便它可以具有这样的代码:
attributes.getBoolean(R.styleable.WebImageView_autoload, autoload)
即自定义属性在res /值/ attrs.xml定义:
<declare-styleable name="WebImageView">
<attr name="autoload" format="boolean" />
...others
</declare-styleable>
这很好,但问题出现在我有第二个应用程序使用相同的视图。现在我更新导入到import com.company.apps.anotherapp.R
,这样它就可以与“anotherapp”一起工作,并用“myapp”打破它。当一次处理多个应用程序时,这成为一个问题。
我的临时解决方案是检查适用类的更新,然后将svn:externals锁定到该特定修订。每个应用程序最终都被锁定到了一个不同的修订版本,而这个版本很快就会变得杂乱无章,但这似乎比将各个类直接复制到应用程序的回购更好。
唯一的其他解决方案,我一直在使用反射,像想到这一点:
Class class = Class.forName(context.getPackageName() + ".R");
Field[] fields = class.getDeclaredFields();
然后遍历领域,指派我关心到变量在整个类使用的人。这似乎相当笨拙,特别是当我们可以谈论几个需要这样做的课程时。
我该如何解决这个问题?有没有办法动态导入com.company.apps。*。R或以某种方式生成不依赖于特定应用程序的不同R类?还是有其他一些明显的(或不是很明显的)解决方案,我完全错过了?
嗨,你有没有做任何特殊的自定义属性在你的图书馆项目工作?当我尝试它时,只有在库和最终应用程序使用相同的名称空间时才能成功编译。如果我想要2个应用程序使用相同的库(例如:免费和付费版本),这种方法效果不佳。 – Gromix 2011-02-24 11:32:35