情景:最近产品有个小需求,通过自定义配置xml的形式改变界面布局形式,其中大家常见的资源图片Drawable设置方 式是获取资源Id,但是R是后生成的,所以这种方式的话并不是很理想。
思路:1)看到网上有反射的方式如下:
/**
* 获取图片名称获取图片的资源id的方法
* @param imageName
* @return
*/
public int getResourceByReflect(String imageName){
Class drawable = R.drawable.class;
Field field = null;
int r_id ;
try {
field = drawable.getField(imageName);
r_id = field.getInt(field.getName());
} catch (Exception e) {
r_id=R.drawable.b_nothing;
Log.e("ERROR", "PICTURE NOT FOUND!");
}
return r_id;
}
弊端:在正是发布的时候,发现不可行,需要在混淆中放开R.
-keep public class **.R {
public *;
}
-keep public class **.R$* {
public *;
}
-keep class **.R$*
2)第二种方式采用如下
ImageView iv = (ImageView) findViewById(R.id.iv);
Resources res = getResources();
int id = res.getIdentifier("ic_launcher", "drawable", context.getPackageName());
iv.setBackgroundResource(id);
实现效果:正是发布不影响使用,混淆不需要keep -->R。