Android动态获取资源ID并使用javabean进行赋值

一、问题

在最近的项目当中遇到这样一个问题,访问网络获取一个企业的详细信息,并显示在客户端,因为信息数量相当多,进一步造成对应的javabean字段非常之多,如果使用javabean.field的方式进行赋值,一方面工作量大,另一方面,非常的容易出错。
这时候就想到使用内省机制,对javabean进行赋值和取值操作,但是,无奈,Android的SDK当中没有引入java的内省机制。于是转战反射。使用反射机制将javabean动态获取javabean当中的字段,并动态获得R.id()的字段,如果这两个字段名相同,就在获得R.id()字段对应的值(Int),然后得到相应的view,并进行赋值操作。
同样,在解析从网络当中获取的字符流时,同样也可以使用这种方式进行赋值操作。

二、示例代码

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。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值