我现在已经开发了几个 Android 应用程序,并创建了一个我经常在多个应用程序中使用的类的代码库。这段代码都在一个 subversion (svn) 存储库中,每个应用程序都在它自己的存储库中。然后每个应用程序都有所需包的 svn:externals 引用(例如,com.company.android.views)。这很好用,除非必须为自定义属性导入 R 类。
自定义视图具有如下导入:
import com.company.apps.myapp.R
这样它就可以有这样的代码:
attributes.getBoolean(R.styleable.WebImageView_autoload, autoload)
该自定义属性在 res/values/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 类?还是有其他一些我完全错过的明显(或不那么明显)的解决方案?