在开发中, 我们习惯了类似下面这种方式去实现引用资源:
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);
更多例子:
一,获取android工程里面的各种资源的id;
1.1 string型 比如下面:
<< string name=”OK”>> 客户端请求成功 << / string>>
//string资源中 名称为OK的 id 获取方式
int strId = getResources().getIdentifier("OK", "string", getPackageName());
- 1
- 2
1.2 color型 比如下面:
<< color name=”colorPrimary”>>#3F51B5 << /color>>
//color资源中 id 获取
int colorId = getResources().getIdentifier("colorPrimary", "color", getPackageName());
- 1
- 2
1.3 dimens型 比如下面:
<< dimen name=”horizontal_margin”>16dp<< /dimen>>
//deimens资源 id 获取
int dimenId = getResources().getIdentifier("horizontal_margin", "dimen", getPackageName());
- 1
- 2
1.4 mipmap文件夹下或者drawable文件夹下面的:比如ic_launcher.png
// mipmap文件夹下的名称为ic_launcher的图片的id
//mipmap资源id
int mipmapId = getResources().getIdentifier("ic_launcher", "mipmap", getPackageName());
- 1
- 2
- 3
1.5布局文件资源 比如R.layout.activity_main
//布局文件的id,比如:R.layout.activity_main
//布局资源id
int layoutId = getResources().getIdentifier("activity_main", "layout", getPackageName());
- 1
- 2
- 3
二.获取Android系统里面的资源id
//获取系统里的资源id android.R.drawable.ic_menu_share
int id = getResources().getIdentifier("ic_menu_share", "drawable", "android"); //注意,最后一个参数必须是“android
- 1
- 2
三.获取Android工程资源的Uri路径,一般是图片,res或者asset下的
//*获取Res资源的url ContentResolver.SCHEME_ANDROID_RESOURCE*/
Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.mipmap.ic_launcher);
Uri uri = Uri.parse("res:///" + R.mipmap.ic_launcher);
//*获取asset资源的url,ContentResolver.SCHEME_FILE*/
Uri assetUri = Uri.parse("file:///android_asset/" + "qq.png");
- 1
- 2
- 3
- 4
- 5