您的位置:首页 > 移动开发 > Android开发

Android 反射方法调用R文件,解除包名依赖

2017-05-16 17:05 204 查看
如果是R.id 或者R.drawable ,可以通过  context.getResource().getIdentifier(name,"id",context.getPackageName())  这种方式获得ID,

经过测试发现R.styleable R.attr 获取不到,这种情况可以通过反射的方法

/**
*
* @param context
* @param type
* @param name
* @return
*/
public static Object getResourceData(Context context, String type, String name) {
try {
Class<?> arrayClass = getResourceClass(context, type).getClass();
Field intField = arrayClass.getField(name);
return intField.get(arrayClass);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

private static HashMap<String, Object> ResourceClass = new HashMap<String, Object>();

private static Object getResourceClass(Context context, String type) {
if (ResourceClass.containsKey(type)) {
return ResourceClass.get(type);
} else {
try {
Class<?> resource = Class.forName(context.getPackageName() + ".R");
Class<?>[] classes = resource.getClasses();
for (Class<?> c : classes) {
int i = c.getModifiers();
String className = c.getName();
String s = Modifier.toString(i);
if (s.contains("static") && className.contains(type)) {
ResourceClass.put(type, c.getConstructor().newInstance());
return ResourceClass.get(type);
} else {
continue;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}

这种方法兼容R文件里的所有内容,取出来之后类型强制转换一下就好了
(int[]) getResourceData(context, "styleable", "Setting")

(Integer) getResourceData(context, "id", "title")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android R文件反射