专栏首页刘晓杰AnnotationProcessor实战:实现ButterKnife的findViewById方法

AnnotationProcessor实战:实现ButterKnife的findViewById方法

Note:

本文只是对这篇文章的一个说明。也可以认作是本人对它的理解和认识

1.问题引入

我们现在需要实现findViewById,通常是这么写的

TextView tv = (TextView) view.findViewById(R.id.tv_name);

要实现findViewById,需要四个参数(控件类型,控件变量名,宿主view(通常是activity,我们一般省去),以及控件id) BindView 通常是如下使用的

@BindView(R.id.tv_name)
TextView mTv;

此时,四个参数中已经有了三个参数,最后一个宿主参数可以另外传进去

2.具体实现细节

(1)ViewFinder和它的实现类ActivityViewFinder就是实现findViewById的,可以这么写,其实也可以直接写在AbstractProcessor里面 (2)LCJViewBinder---使用静态类来管理变量和id的绑定和解绑 可以看到最终的实现就是通过ViewBinder来实现的。具体的实现要等后面AbstractProcessor的实现 (3)BindViewField是用来保存标注了BindView的信息的,也就是之前说的三个参数 (4)AnnotatedClass 是用来管理所有BindViewField变量的 (5)最后着重看一下AbstractProcessor的process的方法实现

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        mAnnotatedClassMap.clear();
        try {
            //遍历所有BindView注解
            //根据activity所在的全名生成AnnotatedClass
            //根据注解生成对应的BindViewField并且保存在对应的AnnotatedClass下
            processBindView(roundEnv);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
            error(e.getMessage());
        }

        for (AnnotatedClass annotatedClass : mAnnotatedClassMap.values()) {
            try {
                //将找到的所有的BindView的信息写进java文件里面去
                //需要对JavaPoet有一定的了解
                annotatedClass.generateFile().writeTo(mFiler);
            } catch (IOException e) {
                error("Generate file failed, reason: %s", e.getMessage());
            }
        }
        return true;
    }

3.总结

理解起来其实不是很困难,主要是有很多细节需要处理,另外还有不常用的库(JavaPoet)需要熟悉加了解

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • getIdentifier获取资源id

    首先我想到的是反射,但是经过实验发现提示报错no emoty constructor。

    提莫队长
  • .net的DataTable.AcceptChanges解释

    .net中用datatable更新数据库的方法之前已经讲过(http://blog.csdn.net/lxj1137800599/article/details...

    提莫队长
  • PopUpWindow的使用

    PopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的。

    提莫队长
  • 微信小程序模板消息实现(PHP+ 小程序)

    参考官方文档和部分资料,总结小程序模板消息推送以及相关注意事项,楼主踩过的坑,特来与大家分享。

    ITer.996
  • 面试官:mysql如何重置自增id

    面试官:咱们聊聊mysql的自增id。mysql自增id给我们的自增主键定义带来了很大的方便,但是经常mysql的自增id会有不连续情况,能说说什么场景下mys...

    jinjunzhu
  • 简单的权限(拦截)管理

    晚上没宵夜
  • 玩转Mysql系列 - 第8篇:分组查询详解(group by & having)

    where是在分组(聚合)前对记录进行筛选,而having是在分组结束后的结果里筛选,最后返回整个sql的查询结果。

    路人甲Java
  • mysql 统计join数据的条数

    当mysql  left join 或者 right join 时,有时候会发现count(*)是无法统计正确数据的

    仙士可
  • [PHP] RBAC权限与审批流的简单数据库构想

    陶士涵
  • 在项目中使用Mybatis

    4.include:有时候两个方法要返回的字段都一样或者where子句一样,这样为了避免重复写代码,就抽出来用include

    三哥

扫码关注云+社区

领取腾讯云代金券