layout: post category : 系列 tagline: "android-框架系列"
android 利用注解加反射完成ui构造,ui绑定,点击事件绑定。
Activity初始化的时候,传入Activity,然后利用反射,运行时,去获取其中的所有注解,并通过注解去获取id,绑定点击事件
Field[] fields = injectedSource.getClass().getDeclaredFields();//运行时获取所有类成员
if(fields!=null && fields.length>0){
for(Field field : fields){
ViewInject viewInject = field.getAnnotation(ViewInject.class);//找到ViewInject注解
if(viewInject!=null){
int viewId = viewInject.id();
try {
field.setAccessible(true);
field.set(injectedSource,sourceView.findViewById(viewId)); //绑定界面
} catch (Exception e) {
e.printStackTrace();
}
String clickMethod = viewInject.click();
if(!TextUtils.isEmpty(clickMethod))
setViewClickListener(sourceView,field,clickMethod); //绑定监听
}
}
}
view注解类
以下两个元注解: @Target 用于标识注解作用域, type,field,mod
@Retention 得到时状态.
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME) //申明只有在运行时通过反射来得到注解
public @interface ViewInject {
public int id();
public String click() default "";
public String longClick() default "";
public String itemClick() default "";
public String itemLongClick() default "";
public Select select() default @Select(selected="") ;
}
使用
@ViewInject(id=R.id.button,click="btnClick") Button button;