利用“反射”动态加载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进制。您瞧 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/5442860.html,如需转载请自行联系原作者

相关文章
|
Java
Java反射机制动态操作
Java反射机制动态操作
55 0
|
2月前
|
缓存 监控 算法
如何确保延迟加载的资源能够在需要时及时加载?
【10月更文挑战第14天】保障延迟加载资源的及时加载是一个复杂而持续的过程,需要我们不断地探索和实践。通过合理的设计、优化和管理,我们能够为用户提供更流畅、高效的体验,同时也能更好地发挥资源的价值。
34 2
|
7月前
|
Java
【专栏】Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
80 4
|
Linux Go API
MemoryModule内存反射DLL加载探索
MemoryModule内存反射DLL加载探索
|
开发框架 .NET Java
C#下反射动态加载dll后如何卸载?
C#下反射动态加载dll后如何卸载?
|
Java
有几种方式获取字节码文件对象?
有几种方式获取字节码文件对象?
119 0
|
JavaScript 前端开发
JavaScript判断各种资源是否加载完成的方法汇总,资源预加载问题
JavaScript判断各种资源是否加载完成的方法汇总,资源预加载问题
992 0
|
XML Java 数据格式
反射机制(什么是反射、反射操作构造器、方法、字段、反射加载资源)
反射机制(什么是反射、反射操作构造器、方法、字段、反射加载资源)
161 0
反射机制(什么是反射、反射操作构造器、方法、字段、反射加载资源)
|
算法 安全 Java
在运行期通过反射了解JVM内部机制
在日常工作中,我们都习惯直接使用或者通过框架使用反射。在没有反射相关硬编码知识的情况下,这是Java和Scala编程中使用的类库与我们的代码之间进行交互的一种主要手段。但是,使用反射仅限于JVM内部运行的Java和Scala代码。假使在运行期通过反射既能查看自己的代码又能看到JVM的代码,会有怎样的效果呢 ?
152 0
在运行期通过反射了解JVM内部机制