2011-01-11 62 views
2

我已经开发了几个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类?还是有其他一些明显的(或不是很明显的)解决方案,我完全错过了?

回答

0

花了我一阵子,但我找到了一个很好的答案:Library Projects

结构上,库项目与标准的Android应用程序项目相似。例如,它包含项目根目录下的清单文件,以及src /,res /和类似的目录。该项目可以包含与标准Android项目相同类型的源代码和资源,以相同方式存储。例如,库项目中的源代码可以通过其R类访问自己的资源。

+0

嗨,你有没有做任何特殊的自定义属性在你的图书馆项目工作?当我尝试它时,只有在库和最终应用程序使用相同的名称空间时才能成功编译。如果我想要2个应用程序使用相同的库(例如:免费和付费版本),这种方法效果不佳。 – Gromix 2011-02-24 11:32:35

相关问题