Android 动态获取资源的ID

2023-05-10 19:10:43 浏览数 (2)

如下办法

代码语言: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.

0 人点赞