一、原理
普通的开发时,如果要给一个View设置背景颜色,通常会这样
view.setBackgroundColor(context.getResources().getColor(R.color.black));
context.getResources()
返回一个Resources
对象,里面有getColor(...)
,getString(...)
等方法,可以通过这些方法返回颜色字符串等。那么,如果我们如果能从另一个地方获取Resources
对象,例如一个皮肤包,然后读取里面的颜色图片等,是不是就可以换肤了呢。
二、如何获取皮肤包的资源文件
AssetManager提供了这么一个方法,通过path更改Asset路径.该方法是hide的。
public int addAssetPath(String path) {
return addAssetPathInternal(path, false /*overlay*/, false /*appAsLib*/);
}
然后Resources的构造方法是这样的:
public Resources(AssetManager assets, DisplayMetrics metrics, Configuration config) {
this(null);
mResourcesImpl = new ResourcesImpl(assets, metrics, config, new DisplayAdjustments());
}
所以,想要通过皮肤包创建一个Resources,需要这样写:
private Resources getAsseResources(Context context, String skinApkPath) {
try {
Method method = AssetManager.class.getDeclaredMethod("addAssetPath", String.class);
AssetManager assetManager = AssetManager.class.newInstance();
method.invoke(assetManager, skinApkPath);
return new Resources(assetManager,
context.getResources