android View 动态注解方式,初始化注入对象原理及实现过程


目前流行的注解给view赋值的框架很多,可以参考比较下:http://blog.csdn.net/p892848153/article/details/50433279

大体上说,就是在运行时,使用java的注解技术,动态去获取contentview中的指定id的view对象,然后,赋值给这个view。

如androidannotations框架的用法

@ViewById(R.id.three_d_view)
Roll3DView tdView;
有个ViewById的注解类,里边有个
int value() default 0;
这样的注解属性,然后这个就是R.id.XXXX的十六进制值了。


以下详细案例来自

zhangyuChen1991 / Roll3DImageView

github动画旋转案例:

点击打开链接


具体的使用方法如下:

首先定义注解类型,这个是运行时,作用在定义在字段上边的注解

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;
}
其次,定义了注解,就得获取注解,然后动态赋值
import android.app.Activity;

import java.lang.reflect.Field;

/**
 * View注解工具
 * Created by zhangyu on 2016-07-11 15:15.
 */
public class  ViewInjectUtil {

    private static final String TAG = "ViewInjectUtil";
    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对象的时候,声明下注解,绑定哪个viewid,然后就不需要一个个手动findViewById()了
    @ViewInject(R.id.debug_btn)
    private Button debugBtn;

看到了这里,是不是很简单呢。
这个只是查找view,给view自动赋值的用法,像androidannotations,还有@AfterInject,@Click({R.id.x1,R.id.x2})等用法,
原理也是和这个类似,有兴趣可以多研究前辈们的源码风格和原理,汲取有利自身的营养。
 
 
简单的小计一下,本文完!
 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值