如下办法
代码语言:javascript复制// 重要:注意不要添加后缀名! Imageview.setBackgroundResource(getResources().getIdentifier("add","drawable",getPackageName()));
但是对于以上做法, 官方并不推荐,并且 getIdentifier这个写library的时候, 如果里面需要引用主程的资源且R所在的包名未知时还是很有用的(如果在gradle里修改了packageName, R所在的包名是和packageName不一样的,没法反射),当然也是有解决的办法: 如果愿意,是可以根据业务拼接出 “package_name.R.drawable.class” 的。但是如果这样的话,视具体情况一定有更好的解法。
以上摘自该评论
se of this function is discouraged. It is much more efficient to retrieve resources by identifier than by name.
在Nenus 5上,100,000次调用大概花费8500ms。另外,这个方法,需要一个Context的引用。
推荐的做法
代码语言:javascript复制// 在你的代码中使用此方法
public static int getResId(String variableName, Class<?> c) {
try {
Field idField = c.getDeclaredField(variableName);
return idField.getInt(idField);
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
代码语言:javascript复制int id = getResId("icon", R.drawable.class);
Nenus 5, 100,000次,大概是1700ms。这个方法快多了,也不需要带入Context.