? ? ? ? ? ?有时候提供的jar需要内嵌到第三方app,但是本身又使用到layout,drawable,string等资源,就需要用到动态获取资源id。
? ? ? ? ? ?比如原先我们设置页面是这样的
?? ?setContentView(R.layout.main);?? ?
? ? ? ? ? 现在需要改成这样:
? ? ? ? Utils.setPackageName(getPackageName()); ?? ??? ?Utils.setContext(getApplicationContext());
? ???? ?setContentView(Utils.getResourceId(Utils.packageName, "layout", ?? ??? ??? ??? ?"chinapay_main"));?? ?
public static Context mContext = null;
/**
* 设置上下文.
*
* @param name
* 包名
*/
public static void setContext(Context context) {
mContext=context;
}
/**
* 动态获取资源编号.
*
* @param packageName
* 包名
* @param typeName
* 资源类型
* @param instenceName
* 资源名
* @return int
*/
public static int getResourceId(String packageName, String typeName,
String instenceName) {
if (packageName != null && typeName != null && instenceName != null) {
try {
//反射这种方式大部分商户可以
// Class<?> cl = Class.forName(packageName + "$" + typeName);
// Field field = cl.getField(instenceName);
// return field.getInt(cl);
//20211026 某商户表示R做了内联,以上方法,无法找到资源,要求改用getResources方式
return mContext.getResources().getIdentifier(instenceName,typeName,packageName);
} catch (Exception e) {
e.printStackTrace();
}
}
return -1;
}
|