zoukankan      html  css  js  c++  java
  • 关于Android中根据ID名动态获取资源的两个方法

    在开发中, 我们习惯了类似下面这种方式去实现引用资源:
    
    context.getResources().getDrawable(R.drawable.flower);
    
    但是,当我们提前知道这个资源的id,想动态去引用,而不是在id里面固化应该怎么办呢? 比如某个图片资源的id是R.drawable.test_1, 而且有序的还有test_2,test_3, 我们如何动态的去引用它们?这里有两种方案:直接用反射和用resource的getIdentifier()方法,它们原理都差不多利用反射实现.
    
    第一种方法:
    
        /**
             * 输入id,返回Bitmap
             * @param context
             * @param id
             * @return
             */
            public static Bitmap getBitMapById(Context context,String id){
                Bitmap mBitmap=BitmapFactory.decodeResource(context.getResources(),getresourceId("test_"+id));
                return mBitmap;
            }
            
            public static int getresourceId(String name){
                Field field;
                try {
                    field = R.drawable.class.getField(name);
                    return Integer.parseInt(field.get(null).toString());
                } catch (NoSuchFieldException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (NumberFormatException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return 0;
            }
    
    
    第二种方法(更加简洁):
    
        public static Bitmap getBitmapById(Context context,String id){
                Resources res = context.getResources();
                Bitmap mBitmap=BitmapFactory.decodeResource(res, res.getIdentifier(id, "drawable", "com.test.android"));
                return mBitmap;
            }
    
    
    第二种方法中res.getIdentifier()里面三个参数: 第一个是资源id名,第二个是类名,如果是string类型就是String,还有常见的drawable,layout等等,第三个参数是项目包名.
    
    
    上面2种方法都能动态获取资源,当我们知道某些资源的id是规律性的,比如前缀相同,后缀都是a-z 或者数字排序等等,就能动态构造id获取资源,而不必每次都写context.getResources().getDrawable(R.drawable.test_1);
    
    希望对大家有帮助.
  • 相关阅读:
    进度条与拖动条的使用学习
    双指针,BFS和图论(三)
    dubbo文档笔记
    ByteBuf
    Netty源码解析—客户端启动
    Netty源码解析---服务端启动
    java并发程序和共享对象实用策略
    docker命令
    elasticSearch基本使用
    Filebeat6.3文档—Log input配置
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/9684742.html
Copyright © 2011-2022 走看看