需求:
封装了工具类和框架,其中用到了资源文件(res文件下的图片,xml等),将我们封装的工具类使用在客户的app上,要求以jar包的方式调用,不能暴露源码。
出现问题:
我封装了一个UI,需要用到资源文件,但是eclipse不能满足将项目联同资源文件一起打包,尽管Export Jar File时全勾选了.
问题解决思路:
1.使用一个中间项目,添加工具类的jar和资源文件,然后引用这个中间项目
2.使用反射的方法解决jar内的类访问不到中间项目资源文件的问题
问题解决的步骤:
1.工具类项目中通过反射来访问资源文件(最重要的步骤)
/**
*
* 通过反射获取所在项目包下的资源文件id
* @author Appjoyo
*
*/
public class MResource {
public static int getIdByName(Context context, String className, String name) {
String packageName = context.getPackageName();
Class r = null;
int id = 0;
try {
r = Class.forName(packageName + ".R");
Class[] classes = r.getClasses();
Class desireClass = null;
for (int i = 0; i < classes.length; ++i) {
if (classes[i].getName().split("\\$")[1].equals(className)) {
desireClass = classes[i];
break;
}
}
if (desireClass != null)
id = desireClass.getField(name).getInt(desireClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return id;
}
}
这样引用:
// 因为要封装成jar包,所以通过反射的方式获取资源id
int layoutId = MResource.getIdByName(mActivity.getApplication(), "layout", "slidingmenumain");
mSlidingMenu = (SlidingMenu) LayoutInflater.from(mActivity).inflate(layoutId, null);
2.将工具类的项目打成jar包,此处简称tool.jar,注意在导出时只勾选src
3.新建一个项目 ,此处简称为jarLibrary,将tool.jar添加到该项目的lib文件下。
4.将工具类中用到的资源文件 ,直接粘贴复制到jarLibrary项目的res对应目录下。
5.将项目jarLibrary设置为Library项目(右键单击jarLibrary,选择 properties,选择Android,将isLibrary勾选,最后点击确定)
6.客户项目,此处简称为WorkApp,引用jarLibrary(右键单击,选择 properties,选择Android,选择add,选择jarLibrary,最后点击确定)