2.4.2、实例一:自动绑定Activity中的控件

大纲:0.0、android学习笔记_大纲

源码地址:https://github.com/ldy1993/ToolforAS.git

 

实例一:这个注解用于自动绑定Activity中的控件。

如果用反射来调用类中方法。先创建一个findViewById的注解

注意的是这里需要使用元注解

所谓元注解,就是加在注解上的注解。

其中

  • @Documented

用于制作文档,不是很重要,忽略便是

  • @Target

加在注解上,限定该注解的使用位置,比如方法或者成员字段是否可以加注解。暂时不用理会。

  • @Retention(注解的保留策略)

 

注解的保留策略有三种:SOURCE/ClASS/RUNTIME

SOURCE代表注解保留在java文件中。

ClASS代表注解保留在磁盘的Class文件中

RUNTIME代表了注解保留在运行内存的Class文件中。

所以要想使用反射。需要使得注解保留在内存的Class文件中。如下

编译器代码 

    public static void findViewByIdCompiler(Activity activity) {
        Log.e("ldy","findViewByIdCompiler");
        FindViewById value = null;
        Class clazz = null;
        try {
            clazz = activity.getClass();
            if (clazz != null) {
                Field[] fields = clazz.getDeclaredFields();
                for (Field field : fields) {
                    if (field.isAnnotationPresent(FindViewById.class)) {
                        value = field.getAnnotation(FindViewById.class);
                        Log.e("ldy","value="+value.value());
                        //判断该属性是否是属于View的子类类型,并且不是静态属性
                        if(View.class.isAssignableFrom(field.getType()) && !Modifier.isStatic(field.getModifiers())) {
                            Method method =clazz.getMethod("findViewById", int.class);
                            method.setAccessible(true);
                            //将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
                            Object view = method.invoke(activity, value.value());
                            try {
                                // 通过反射拿私有对象,需要加上这一句
                                field.setAccessible(true);
                                field.set(activity, view);
                            } catch (IllegalAccessException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 然后再代码中使用注解

@FindViewById(R.id.bt_basic_characteristics)
public Button bt_basic_characteristics;

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值