| 我们都知道在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都需要去实现这个接口。 (编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |