利用“反射”动态加载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 ...
随机推荐
- xml之基本操作
XML:Extensible Markup Language(可扩展标记语言)的缩写,是用来定义其它语言的一种元语言,其前身是SGML(Standard Generalized Markup Lang ...
- 5.14JDBC
一.##JDBC 1. 概念:Java DataBase Connectivity Java 数据库连接, Java语言操作数据库. JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数 ...
- Android嵌入式(初稿)--路漫漫其修远兮,吾将上下而求索
- 5、scala数组转换
1.使用yield和函数式编程转换数组 2.算法案例:移除第一个负数之后的所有负数 1.使用yield和函数式编程转换数组 使用yield进行数组转换 结合if守卫,仅转换需要转换的元素 使用函数式编 ...
- AI:IPPR的数学表示-CNN方法
前言: 随着超量类别PR和高精度的需求,人工特征方法局限性凸显出来,固定的特征hash压缩映射因其压缩损失.表现为特定的特征hash方法,在海量的同类数据集上近邻特性变差,而在不同类别的数据上面隔离性 ...
- End to End Sequence Labeling via Bi-directional LSTM CNNs CRF
来看看今日头条首席科学家的论文: End-to-end Sequence Labeling via Bi-directional LSTM-CNNs-CRF 使用LSTM方法进行序列标注,完成大规模标 ...
- 微信小程序,时间戳和日期格式互相转化
微信小程序,时间戳转为日期格式 通常后台传递过来的都是时间戳,但是前台展示不能展示时间戳.就需要转化了. 功能说明: 微信小程序里,时间戳转化为日期格式,支持自定义. 拷贝至项目utils/utils ...
- Robot Framework(五)使用测试库
使用测试库 测试库包含那些最低级别的关键字,通常称为 库关键字,实际上与被测系统交互.所有测试用例总是使用某些库中的关键字,通常是通过更高级别的用户关键字.本节介绍如何使用测试库以及如何使用它们提供的 ...
- eas之KDPrinter控件
初始化打印控件KDPrinter ctrlPrinter = new KDPrinter(); 增加列 // 指定插入位置table.addColumn(index);// 插入到最后table.ad ...
- HDU1029 - Ignatius and the Princess IV【水题】
给你n个数字,请你找出出现至少(n+1)/2次的数字. 输入 本题包含多组数据,请处理到EOF: 每组数据包含两行. 第一行一个数字N(1<=N<=999999) ,保证N为奇数. 第二行 ...