一、问题
二、示例代码
private void addDate() {
try {
// 首先反射javabean得到全部的属性
Field[] fields = DianweiDetialInfo.class.getDeclaredFields();
// 反射R文件得到全部id
for (Field f : fields) {
// 将其属性设置为可读
f.setAccessible(true);
// 反射R文件得到想要的id字段
if (f.getName().equals("guid")
|| f.getName().equals("serialVersionUID")) {
continue;
}
Field field = R.id.class.getField(f.getName());
// 得到其值
int i = field.getInt(new R.id());
// 通过id值的到相应的TextView并赋值
String value = String.valueOf(f.get(dianweiDetialInfo));
if (!TextUtils.isEmpty(value)){
value = value.trim();
((TextView) findViewById(i)).setText(value);
}
}
} catch (Exception e) {
Logger.d("I am here!!!");
Toast.makeText(this, getString(R.string.on_selecting_error),
Toast.LENGTH_SHORT).show();
}
}
三、注意问题
注意,由于在项目当中使用了反射机制,在对应用进行打包操作并且使用了混淆机制时,要注意将使用了反射的javabean去除,不要对其进行混淆操作。否则程序无法正常运行。
四、扩展方案
大牛,http://blog.csdn.net/kmyhy/article/details/6583804,提出一种更好的解决方案。
使用Resources 类的 getIdentifier方法
使用反射毕竟还是麻烦。如果同样的事情用android.content.res.Resources类来干,就是两句话而已:
Resources res=getResources();
return res.getIdentifier(type,"drawable",getPackageName());
getResources方法是来自于contenxt(也就是Activity类),它直接可以返回一个Resouces对象。而Resouces的getIdentifier方法可以返回R.java中的任何资源id,当然,你必须指定3个参数:字段名,类名,包名。包名指定了的 全限定名的包名部分,如果R 的全限定名为 android.R 或者 com.company.R,则包名在这里就是“android”或“com.company”。getPackageName其实是this.getPackageName(),它直接返回本类的包名。
类名则是资源所属的类。比如我们知道的,在R.java 类中的几个固定的类:drawable、id、string、layout等,在它们下边又定义了许多资源id。
字段名则是资源id的名字。比如这个资源id定义:public static final intdel=0x7f020002;
del就是一个资源id的名字,0x7f020002则是它的16进制值。
通过3个参数,getIdentifier 方法就可以通过比较动态的方式获得资源id。