前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AnnotationProcessor实战:实现ButterKnife的findViewById方法

AnnotationProcessor实战:实现ButterKnife的findViewById方法

作者头像
提莫队长
发布2020-06-02 15:27:33
4020
发布2020-06-02 15:27:33
举报
文章被收录于专栏:刘晓杰

Note:

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

1.问题引入

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

代码语言:javascript
复制
TextView tv = (TextView) view.findViewById(R.id.tv_name);

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

代码语言:javascript
复制
@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的方法实现

代码语言:javascript
复制
    @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)需要熟悉加了解

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Note:
    • 1.问题引入
      • 2.具体实现细节
        • 3.总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档