android 使用注解来初始化view对象
第一步:定义注解
/**
* 自定义注解(运行时注解)
* @author liuqi
*
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject {
/**
* 返回 view的id
* 默认为0
* @return
*/
int value() default 0;
}
第二步:实现注解的功能
主要运用反射原理,遍历当前activity(当然可以扩展使用View)上定义的使用了自定义注解的view属性。
根据注解传入的参数(资源ID),利用反射执行activity.activity.findViewById方法获取view对象,再将该view设置给它的引用即可。
/**
* 注解工具
* @author liuqi
*
*/
public class ViewInjector {
/**
* 启动注解
* @param activity
*/
public static final void inject(Activity activity){
Objects.requireNonNull(activity);
try {
Class<? extends Activity> clazz_con = activity.getClass();
Field[] fields = clazz_con.getDeclaredFields();
for (Field field : fields){
field.setAccessible(true);
boolean bViewClass = View.class.isAssignableFrom(field.getType());
if (!bViewClass){
continue;
}
Annotation[] annotations = field.getDeclaredAnnotations();
for (Annotation annotation : annotations){
if (!(annotation instanceof ViewInject)){
continue;
}
ViewInject injector = (ViewInject)annotation;
View view = activity.findViewById(injector.value());
field.set(activity, view);
}
}
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
第三步:给view加上注解
在activity中定义view的引用变量,
第四步:启用注解
一定要在setContentView之后执行,确保注解工具能够找到id对应的view。
总结:同样的原理,可以给view加上其他的注解,比如点击事件等。也可以根据view来初始化子view。
当然也可以给其他对象加注解,实现不同的功能。