根据字符串获取资源id
2016-12-19 16:02
260 查看
一般地,我们给一个
有时我们有动态设置图片资源的需要,这是需要根据给定字符串获取指定资源的id,比如给出
找到本地资源id,如下代码:
Android提供这样的方法: Resources.getIdentifier()
使用方法如下:
对于这个方法,官方不推荐:
use of this function is discouraged. It is much more efficient to retrieve resources by identifier than by name.
在Nenus 5上,100,000次调用大概花费8500ms。另外,这个方法,需要一个
实际我们需要获取的是
源码在这里
使用方法:
Nenus 5, 100,000次,大概是1700ms。这个方法快多了,也不需要带入Context.
当然,如果你足够大胆,你可以这样:
但是这样的方法,维护起来简直是一个噩梦。
https://www.liaohuqiu.net/cn/posts/android-get-resource-id-by-string/
ImageView设置一个图片可能会采用以下代码:
int resId = R.drawable.icon; imageView.setImageResource(resId);
有时我们有动态设置图片资源的需要,这是需要根据给定字符串获取指定资源的id,比如给出
icon,
找到本地资源id,如下代码:
function getResId(String name) { }
Android提供这样的方法: Resources.getIdentifier()
使用方法如下:
function getResId(String name, Context context) { Resources r = context.getResources(); int id = r.getIdentifier("icon", "drawable", "in.srain.cube.sample"); return id; }
对于这个方法,官方不推荐:
use of this function is discouraged. It is much more efficient to retrieve resources by identifier than by name.
在Nenus 5上,100,000次调用大概花费8500ms。另外,这个方法,需要一个
Context的引用。
更好的做法
实际我们需要获取的是R.drawable中一个变量,可以用反射:
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; } }
源码在这里
使用方法:
int id = ResourceMan.getResId("icon", R.drawable.class);
Nenus 5, 100,000次,大概是1700ms。这个方法快多了,也不需要带入Context.
当然,如果你足够大胆,你可以这样:
function getResId(String name) { if ("icon".equals(name)) { return R.drawable.icon; } return -1; }
但是这样的方法,维护起来简直是一个噩梦。
https://www.liaohuqiu.net/cn/posts/android-get-resource-id-by-string/
相关文章推荐
- RatingControl
- SQL SERVER运维巡检系列之一——服务器状态及硬件指标
- 【Java学习之代码学习】 Prog31_它是几位数
- RN综合演练(TabBarIOS、NavigatorIOS)
- Codeforces Round #387 (Div. 2)
- copy那些事!
- CH7,数组,---p122,list遍历
- mysql数据库主从判断
- Unity Steam_VR开发工具插件---VRTK 自带案例分析
- HTTP笔记整理(1)
- genymotion 5.0 arm translation
- calico跨主机node访问pod问题
- oracle体系结构
- 搜索引擎 中文分词
- python -- 将string转换成dict的方法
- 解决vSphere 5.1上Linux VM提示:Unable to collect IPv4 routing table问题
- 国内其他的maven库
- Eigen基础
- 《深度探索C++对象模型》学习总结( 4000 二)——关于对象
- hadoop无法访问50070端口