android 第三方jar库 反射得到自己的资源ID

来源:互联网 发布:淘宝云客服选班网站 编辑:程序博客网 时间:2024/06/05 06:20

做jar,jar代码获取资源不能直接引用 R.xx.name,

有两种方法:

1.通过方法: int android.content.res.Resources.getIdentifier(String name,String defType, String defPackage)

 2.通过反射

第一种方法比较常见,主要看第二种方法:


public class ResoureExchange {private static final String TAG = ResoureExchange.class.getName();private static ResoureExchange self;private Context mContext;private static Class<?> CDrawable = null;private static Class<?> CLayout = null;private static Class<?> CId = null;private static Class<?> CAnim = null;private static Class<?> CStyle = null;private static Class<?> CString = null;private static Class<?> CArray = null;public static ResoureExchange getInstance(Context context){if(self == null){self = new ResoureExchange(context);}return self;}private ResoureExchange(Context context){this.mContext = context.getApplicationContext();try{CDrawable = Class.forName(this.mContext.getPackageName() + ".R$drawable");CLayout = Class.forName(this.mContext.getPackageName() + ".R$layout");CId = Class.forName(this.mContext.getPackageName() + ".R$id");CAnim = Class.forName(this.mContext.getPackageName() + ".R$anim");CStyle = Class.forName(this.mContext.getPackageName() + ".R$style");CString = Class.forName(this.mContext.getPackageName() + ".R$string");CArray = Class.forName(this.mContext.getPackageName() + ".R$array");}catch(ClassNotFoundException e){Log.i(TAG,e.getMessage());}}public int getDrawableId(String resName){return getResId(CDrawable,resName);}public int getLayoutId(String resName){return getResId(CLayout,resName);}public int getIdId(String resName){return getResId(CId,resName);}public int getAnimId(String resName){return getResId(CAnim,resName);}public int getStyleId(String resName){return getResId(CStyle,resName);}public int getStringId(String resName){return getResId(CString,resName);}public int getArrayId(String resName){return getResId(CArray,resName);}private int getResId(Class<?> resClass,String resName){if(resClass == null){Log.i(TAG,"getRes(null," + resName + ")");throw new IllegalArgumentException("ResClass is not initialized. Please make sure you have added neccessary resources. Also make sure you have " + this.mContext.getPackageName() + ".R$* configured in obfuscation. field=" + resName);}try {Field field = resClass.getField(resName);return field.getInt(resName);} catch (Exception e) {Log.i(TAG, "getRes(" + resClass.getName() + ", " + resName + ")");Log.i(TAG, "Error getting resource. Make sure you have copied all resources (res/) from SDK to your project. ");Log.i(TAG, e.getMessage());} return -1;}}

直接看代码,一目了然。[来源于反编译友盟统计jar]

原创粉丝点击