做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]



原文作者:H-G-Y

原文地址:http://blog.csdn.net/go_to_learn/article/details/9410727

更多相关文章

  1. Android(安卓)studio gradle 依赖后报错后出现Failed to resolve
  2. android onNewIntent
  3. 安卓部分总结
  4. android 完全退出实现
  5. TextView设置autoLink
  6. Android游戏开发之旅三 View类详解
  7. Android初级教程_获取Android控件的宽和高 .
  8. Android中万能的BaseAdapter的使用
  9. 初涉android中的回调机制

随机推荐

  1. Android 你的OnTouchEvent() 触屏事件的
  2. Android Animation动画详解
  3. Android 签名失败 Lint found fatal erro
  4. 编译Android平台以及SDK
  5. osg for android 学习之三:老外的步骤,包括
  6. Android判断某个Activity是否正在前台显
  7. Android Studio设置gradle代理
  8. 封装Android Volley请求工具
  9. android SQLiteDatabase源码解析
  10. android 管理Bitmap内存 - 开发文档翻译