我们都知道在Android中如果想去获取资源文件都必须通过Resources去获取。这个库的核心思想就是动态的去加载第三方包里面的包,获取到其Resources然后以获取到的这个Resources去获取第三方包里面的资源内容,最后设置到我们有需响应皮肤更改的View上。
这里我就只介绍load和base两个包,其他包的内容在讲解的时候会涉及到
1.load包
我们先来看看这个load包里面的内容(其实这里就是今天核心内容的核心)。

里面有两个类文件:SkinInflaterFactory、SkinManager
我们先来看看SkinManager的实现,直接跳到load方法
- public void load(String skinPackagePath, final ILoaderListener callback) {
- new AsyncTask<String, Void, Resources>() {
- protected void onPreExecute() {
- if (callback != null) {
- callback.onStart();
- }
- }
- @Override
- protected Resources doInBackground(String... params) {
- try {
- if (params.length == 1) {
- String skinPkgPath = params[0];
- Log.i("loadSkin", skinPkgPath);
- File file = new File(skinPkgPath);
- if (file == null || !file.exists()) {
- return null;
- }
- PackageManager mPm = context.getPackageManager();
- PackageInfo mInfo = mPm.getPackageArchiveInfo(skinPkgPath, PackageManager.GET_ACTIVITIES);
- skinPackageName = mInfo.packageName;
- AssetManager assetManager = AssetManager.class.newInstance();
- Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class);
- addAssetPath.invoke(assetManager, skinPkgPath);
- Resources superRes = context.getResources();
- Resources skinResource = new Resources(assetManager, superRes.getDisplayMetrics(), superRes.getConfiguration());
- SkinConfig.saveSkinPath(context, skinPkgPath);
- skinPath = skinPkgPath;
- isDefaultSkin = false;
- return skinResource;
- }
- return null;
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }
- protected void onPostExecute(Resources result) {
- mResources = result;
- if (mResources != null) {
- if (callback != null) callback.onSuccess();
- notifySkinUpdate();
- } else {
- isDefaultSkin = true;
- if (callback != null) callback.onFailed();
- }
- }
- }.execute(skinPackagePath);
- }
这个方法有两个参数,第一个是皮肤包的路径,第二个就是一个简单的回调
其中doInBackground方法里面就实现了动态的去获取皮肤包的Resources,当获取成功之后,在onPostExecute方法中就将这个Resources赋值到我们定义好的变量中去,以方便我们之后的使用,注意到当获取到的这个Resources不为空时,也就是我们已经获取到了皮肤包里面的资源,我们就调用notifySkinUpdate()这个方法来通知界面去更改皮肤,如果为空就还是使用默认的皮肤。
我们来看看notifySkinUpdate()的实现

这里很简单,就是去遍历mSkinObservers这个集合,然后去通知更新。对于ISkinUpdate是一个接口,每个需要皮肤更新的Activity都需要去实现这个接口。
(编辑:威海站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|