前几天做一个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中增加相应方法)
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;}}
上面代码刨去捕获的异常,剩下的干货其实并不多
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的类的onCreate方法中添加两句。
int result = GetPic.getPic("baji");Log.i("result", result+"");
  • 查看日志记录
  • 怎么?你说不对,刚才不是0x7f020000吗,现在显示的是2130837504啊。矮油,您看好进制。刚才是16进制。您瞧


更多相关文章

  1. [置顶] android中图片的三级cache策略(内存、文件、网络)之二:内存
  2. android App自适应draw9patch不失真背景(转)
  3. AndroidStudio mipmap图片大小
  4. android 一张图片实现 ImageView 实现 点击效果 图片明度变化
  5. android之生命周期onSaveInstanceState()状态保存
  6. 浅谈Android中的基础动画(图文详解)
  7. ReactNative之Image在Android设置圆角图片变形问题
  8. Android(安卓)OpenGLES2.0(八)——纹理贴图之显示图片
  9. android:崩溃重启处理

随机推荐

  1. 手动修改Android数据库数据
  2. android发送QQ邮件(带附件)
  3. Android(安卓)检测用户一段时间无操作
  4. Android复习(十一)
  5. Android批量插入数据
  6. Android(安卓)获取内存信息
  7. Android(安卓)加密解密字符串
  8. Android(安卓)手机QQ临时会话
  9. 生成不同ABI版本APK在build.gradle中的配
  10. Android(安卓)View.startAnimation()动画