利用“反射”动态加载R文件中的资源
前几天做一个Android下面数据库相关的应用。用ListVIew展示表中数据的时候我希望能给表中每一条记录,加一个展示的图片。但是用数据库保存图片是比较难搞的。于是就把所需图片都保存到res下的drawable--mdpi文件夹下。接下来的问题是建立一个表中记录到对应图片的索引(表中增加一列来表示),希望能动态的加载相应的图片。通过检索出来的记录中的某个属性值,来加载R文件中的对应的图片资源。
--------------------------------------------------------------------------------------------------------------------
当我们在drawable文件夹下添加一个图片XX时,R文件中的类drawable中也会自动添加一个常量值R.drawable.XX。我习惯称R.drawable.XX为宏名。
--------------------------------------------------------------------------------------------------------------------
但接下来的问题是:即使我给记录增加了一列(比如PID varchar)来表示图片资源(比如R.drawable.XX)。但此时系统也只会把“R.drawable.XX”看作是一个字符串而已。自然无法让这个字符串直接当做常量名来用。也就是说我们从数据库的表中检索出来的某个属性值是字符串(或其他类型)却并不能当做宏名来用。
后来我想到了java中的反射机制或许可以解决这个矛盾。
首先我们在数据库中的增加一列 pid varchar。来保存图片资源的索引,这里我们只需保存XX就行了,无需保存R.drawable.XX。我们很容易通过数据库操作来获得这个字符串pid的值XX。这里就不表数据库的知识了。新建一个类GetPic(也可以不去建造新的类,直接在Activity中增加相应方法)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import java.lang.reflect.Field;//反射用到的类import com.jelly.waimai.R;//我的工程的R文件public class GetPic { public static int getPic(String pid) { Field f; try { f = R.drawable.class.getField(pid); return f.getInt(null); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } return 0; }} |
上面代码刨去捕获的异常,剩下的干货其实并不多
|
1
2
3
|
Field f;f = R.drawable.class.getField(pid);return f.getInt(null); |
Filed类表示的就是类中的成员变量,成员变量本身就有另一个叫法“域”(Filed)。每一个类都有这么一个方法getField。声明如下:
public Field getField(String name)。
这个是属于Class类型的方法,java中每一个类都有一个对应的Class类型的对象(Class本身也是一种类)不能直接
R.drawable.getField(pid)。需要R.drawable.class.getField(pid)。明白了吗?.class的目的就是获得R.drawable类的Class对象。
因为R文件中是以整数的方式来表示(索引)资源的。所以我们执行f.getInt(null);方法声明如下:
public int getInt (Object object)
这个方法在当 f 是static类型的时候,是会忽略参数object的,所以传递null就可以了。否则如果drawable类不是static类型的,这里是需要传递一个drawable对象的。
接下来,做实验:
首先我们保存一个图片到drawable-mdpi文件夹下。我用的是一张“蜜汁手扒鸡”
,图片名为baji.png(好像应该读作pa鸡。。)
然后我们查看R文件中的drawable类中的变化。可以看出R.drawable.baji的值为0x7f020000

接下来,我就不模拟从数据库中获得扒鸡这条记录的pid字符串(此时其值为“baji”)的过程了。那不是我们研究的焦点,我们直接去使用“baji”这个字符串看看。在Activity的类的onCrate方法中添加两句。
|
1
2
|
int result = GetPic.getPic("baji");Log.i("result", result+""); |
查看日志记录

怎么?你说不对,刚才不是0x7f020000吗,现在显示的是2130837504啊。矮油,您看好进制。刚才是16进制。您瞧

利用“反射”动态加载R文件中的资源的更多相关文章
- C# 利用反射动态加载dll
笔者遇到的一个问题,dll文件在客户端可以加载成功,在web端引用程序报错.解决方法:利用反射动态加载dll 头部引用加: using System.Reflection; 主要代码: Assembl ...
- .Net Core利用反射动态加载类库的方法(解决类库不包含Nuget依赖包的问题)
在.Net Framework时代,生成类库只需将类库项目编译好,然后拷贝到其他项目,即可引用或动态加载,相对来说,比较简单.但到了.Net Core时代,动态加载第三方类库,则稍微麻烦一些. 一.类 ...
- java利用反射动态加载方法
@参考文章 根据特定字符串加载相应的方法,有人用if else,有人用switch.参数少了或情况少了还好,很多方法真要命,不要紧,java反射拯救你 import java.lang.reflect ...
- Java_Java中动态加载jar文件和class文件
转自:http://blog.csdn.net/mousebaby808/article/details/31788325 概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下 ...
- [转载] Java中动态加载jar文件和class文件
转载自http://blog.csdn.net/mousebaby808/article/details/31788325 概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下 ...
- java反射并不是什么高深技术,面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象
java反射并不是什么高深技术,面向对象语言都有这个功能. 面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象,去获取类相关的信息 2.利用java反射可以调用类 ...
- Android应用安全之外部动态加载DEX文件风险
1. 外部动态加载DEX文件风险描述 Android 系统提供了一种类加载器DexClassLoader,其可以在运行时动态加载并解释执行包含在JAR或APK文件内的DEX文件.外部动态加载DEX文件 ...
- 两种动态加载JavaScript文件的方法
两种动态加载JavaScript文件的方法 第一种便是利用ajax方式,第二种是,动静创建一个script标签,配置其src属性,经过把script标签拔出到页面head来加载js,感乐趣的网友可以看 ...
- QUiLoader 动态加载.ui文件
动态加载UI文件是指,用 Qt Designer 通过拖拽的方式生产.ui 文件.不用 uic工具把.ui 文件变成等价的 c++代码,而是在程序运行过程中需要用到UI文件时,用 QUiLoader ...
随机推荐
- Spring Boot (16) logback和access日志
Spring Boot 内部采用的是Commons Logging进行日志记录,但是在底层为Java Util Logging.Log4J2.Logback等日志框架提供了默认配置. logback ...
- # Nginx常见问题
try_files的使用 按顺序检查文件是否 存在 location /{ try_files $uri $uri/ /index.php } 解析:在/下寻找$uri,如果没有找到,则去找$uri/ ...
- elasticearch 归并策略
归并线程配置 segment 归并的过程,需要先读取 segment,归并计算,再写一遍 segment,最后还要保证刷到磁盘.可以说,这是一个非常消耗磁盘 IO 和 CPU 的任务.所以,ES 提供 ...
- 从Hive1.0升级到Hive2.0(删除hive1.x中的元数据, 并不是数据迁移)
软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这五部机, 每部主机的用户名都为centos ...
- C# Datetime 使用详解
获得当前系统时间: DateTime dt = DateTime.Now; Environment.TickCount可以得到“系统启动到现在”的毫秒值 DateTime now = DateTime ...
- 微软CRM4.0 页面表单和腾讯QQ在线整合
现在通过QQ和客户联系.洽谈业务及沟通感情的场合越来越多,在微软CRM表单上整合QQ可以方便的显示客户QQ在线状态,点击图标即可和客户进行QQ聊天. 客户在线状态: 客户离线状态: 输入QQ号码后即时 ...
- c#使用RSA进行注册码验证
公司的一个项目快完成了,最后要加上注册验证,翻了n多资料,终于做出来了.现在把体验说一下,以后要用的时候也好找.~~ .Net自带的类库里面有个算法. 这个算法的原理是不对称加密的原理.不对称加密原理 ...
- OpenCV:OpenCV目标检测Adaboost+haar源代码分析
使用OpenCV作图像检测, Adaboost+haar决策过程,其中一部分源代码如下: 函数调用堆栈的底层为: 1.使用有序决策桩进行预测 template<class FEval> i ...
- 读书笔记「Python编程:从入门到实践」_7.用户输入和while循环
7.1 函数input()的工作原理 函数input() 让程序暂停运行,等待用户输入一些文本.获取用户输入后,Python将其存储在一个变量中,以方便你使用. message = input(&qu ...
- 【汇编】dosbox钢琴
DATA SEGMENT msg DB 0DH,0AH,'[ 1 2 3 4 5 6 7 ]' DB 0DH,0AH,' [ q w e r t y u ]' DB 0DH,0AH,'________ ...