Android通过注解初始化View

来源:互联网 发布:截图软件电脑版 编辑:程序博客网 时间:2024/05/20 21:48

本文提炼出一个精简实用版的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.csdn.net/detail/chen_zhang_yu/9572950



0 0
原创粉丝点击