用反射和注解,绑定控件的id和点击事件

最近才开始接触反射和注解的内容,根据项目的中例子,做了一个demo,用于帮定控件的id和点击事件!感谢公司的技术总监的指导!


1.首先要先自定义两个注解,一个是绑定id的,一个是点击事件的

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * id 的绑定点击事件
 * @author ljg
 *
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Onclick {
	//获取需要 设置点击事件的id
	int [] id () default {};
}

/**
 * 绑定id 注解
 * @author ljg
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FindviewByid {
	//绑定id
	int id () default 0;
	
	
}

2:最主要的一步就是,怎么用注解进行工作的

/**
 * 通过注解判断 是否已经标注的管理类
 * 
 * @author ljg
 * 
 */
public class _InfaceManger {

	/**
	 * 绑定 活动的id
	 * 
	 * @param az
	 */
	public static void findViewId(Activity az) {

		Class clazz = az.getClass();
		// 获取activity中的所有字段
		Field[] fields = clazz.getDeclaredFields();
		for (Field ff : fields) {
			// 字段中是否已经被标注
			if (ff.isAnnotationPresent(FindviewByid.class)) {
				// 拿到被标注的字段的注解对象
				FindviewByid fid = ff.getAnnotation(FindviewByid.class);
				// 拿到字段标注的id
				int id = fid.id();
				// 非默认值
				if (id > 0) {
					// 通过反射拿私有对象,徐加上这一句
					ff.setAccessible(true);
					try {
						View view = az.findViewById(id);
						//将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
						ff.set(az, view);
					} catch (IllegalAccessException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IllegalArgumentException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}

			}

		}

	}
3 ,这事要是说通的一点也不难,这最后一步就是用了

用反射和注解,绑定控件的id和点击事件_第1张图片

如上图所示,就是这样,把所有需要进行点击的控件id都列出来,然后,每个控件之上,给予他自己的id。

4:这是最简单,也是最重要的一步

在初始化的时候用反射和注解,绑定控件的id和点击事件_第2张图片

上边这两行代码,如果不写的话,没有一点用。


就是这么简单,完全可以运用到自己的项目中,不用没都去findviewById了,也算属于一个懒人的方法吧!


demo下载

http://download.csdn.net/detail/jiajia1112223/9521311


你可能感兴趣的:(android开发)