本文提炼出一个精简实用版的InjectView工具类,并提供资源下载,省去findViewById()的麻烦。同时梳理这个实现的过程,供后来的童鞋学习和参考~
以前用起来相关工具觉得高大上,其实这个过程也蛮简单的~
梳理一下!
首先,注解的概念:它是一个和类,接口,枚举同级别的一个特性,可以声明在方法参数,类,字段前面,对它们作出解释和说明。
也就是说,注解标识了代码里的元数据,你可以根据这个标识来做你想做的事情
比如常见的@Override,@param,@retur等等。
这些注解的存在使得在生成文档、编译器进行编译检查、甚至在阅读代码时都非常方便,作用很大。
然后,我们要利用注解,当然首先要自定义一个我们自己的注解了,步骤很简单,就像写一个普通类一样,根据格式来,@interface 表示一个注解,代码如下:
package com.cc.library.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 用于findView的注解
* Created by zhangyu on 2016-07-11 11:04.
*/
@Target(ElementType.FIELD) //表示用在字段上
@Retention(RetentionPolicy.RUNTIME) //表示其生命周期是运行时
public @interface ViewInject {
int value() default 0;
}
有了自己的注解,下一步就可以在代码里利用它和自己声明的字段相关联了,如下:
@ViewInject(R.id.round_image)
private ImageView roundImage;
字段roundImage就和常量R.id.round_image关联起来了
然后,我们利用反射,获取指定类(一般是一个Activity)的字段,然后给它赋上相应的值,示例如下:
public static void injectView(Activity activity){
try {
Field[] fields = activity.getClass().getDeclaredFields(); //获取类中声明的字段
for (Field field : fields) {
boolean isAnnotationPresent = field.isAnnotationPresent(ViewInject.class); //字段是否关联注解
if(isAnnotationPresent){
ViewInject viewInject = field.getAnnotation(ViewInject.class); //获取所关联的注解
field.setAccessible(true);
field.set(activity,activity.findViewById(viewInject.value())); //为字段设置findViewById值
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
然后就完成给View注解和赋值了,短短几行代码,就可以大大提高编程效率。
使用也很简单:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "MainActivity";
@ViewInject(R.id.round_image)
private ImageView roundImage;
@ViewInject(R.id.scale_big_image)
private ImageView bigImage;
@ViewInject(R.id.scale_big_image_container)
private RelativeLayout bigImgContainer;
private Drawable imageDrawable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewInjectUtil.injectView(this);//给关联注解的字段设置findViewById()值
}
}
当然,这是我提炼出来的一个极精简版,github上有功能更丰富的工具包,可以自己去找找。
本文资源下载地址:http://download.youkuaiyun.com/detail/chen_zhang_yu/9572950