替换Context也就是要拿到皮肤应用中的Context来获取其中的资源文件,重要的方法是:
public Context createPackageContext (String packageName, int flags)
packageName,皮肤应用的包名
flags 有两个可选项:
CONTEXT_IGNORE_SECURITY:忽略安全。
CONTEXT_INCLUDE_CODE :包含代码。
Caused by: java.lang.SecurityException: Requesting code from com.fly.changeskin (with uid 10045) to be run in process com.fly.testskin (with uid 10046)
拿到Context就可以通过
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.main_layout, null, false); //填充布局
context.getResources().getDrawable(R.drawable.ic_launcher); //得到图片
这里要求的是应用与皮肤apk的资源名字,数量相同。总之保证两个R文件id相同,才能获取想要的资源。其次用到的jar包都要打包入apk。
这样完全替换,导致资源的冗余。但是几乎不用修改代码。
另外有:
mSkinResources = context.getResources();
int configResId = mSkinResources.getIdentifier(CONFIG_XML_NAME,"xml", mSkin);
XmlPullParser xmlpull = mSkinResources.getXml(configResId);
只要求,文件与应用apk中对同一功能的皮肤文件名要一致
例如:应用程序的背景图片路径:\WBlogSkin\res\drawable-hdpi\bg.png
则皮肤apk中的背景图片文件路径也应该是SkinApk\res\drawable-hdpi\bg.png