zoukankan      html  css  js  c++  java
  • 利用“反射”动态加载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进制。您瞧

  • 相关阅读:
    课堂作业04 2017.10.27
    课程作业 03 动手动脑 2017.10.20
    课程作业 03 2017.10.20
    HDU 3974 Assign the task
    POJ 2155 Matrix
    POJ 2481 Cows
    HDU 3038 How Many Answers Are Wrong
    CS Academy Array Removal
    POJ_1330 Nearest Common Ancestors LCA
    CF Round 427 D. Palindromic characteristics
  • 原文地址:https://www.cnblogs.com/yaowen/p/5442860.html
Copyright © 2011-2022 走看看