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