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