本博客介绍ButterKnife的使用及其源码解析。
在Project级别的build.gradle文件中添加为ButterKnife定制的Gradle插件:
  | 
  | 
在Application级别的build.gradle文件中添加ButterKnife插件和依赖代码:
  | 
  | 
用注解@BindView()绑定单个控件id,用注解@BindViews()绑定多个控件id:
  | 
  | 
在Activity中,需要在setContentView()之后添加:
  | 
  | 
切记在Activity的onDestroy()中进行解绑:
  | 
  | 
在Fragment中,需要在onCreateView()的return之前添加:
  | 
  | 
在Fragment的onDestroyView()中进行以下操作:
  | 
  | 
而在ListView或者RecyclerView的Adapter中也可以使用ButterKnife,需要做以下操作:
  | 
  | 
ButterKnife提供了以下资源绑定方式:
  | 
  | 
ButterKnife提供了以下监听绑定方式:
  | 
  | 
  | 
  | 
ButterKnife采用的是编译时注解,自定义了很多常用注解,上文已经讲解在此不再赘述。以@BindView注解为例:
  | 
  | 
其中@Retention(CLASS)用来声明注解的保留策略,表明@BindView注解是编译时注解,而@Target(FIELD)则表明@BindView注解作用于成员变量。
要处理注解需要使用到注解处理器,ButterKnife的注解处理器是ButterKnifeProcessor,继承自AbstractProcessor。
  | 
  | 
在注解处理器ButterKnifeProcessor中注解处理的主要逻辑都在process()中:
  | 
  | 
接下来查看在process()中调用的findAndParseTargets():
  | 
  | 
接下来查阅parseResourceAnimation()代码:
  | 
  | 
其中,parseResourceAnimation()中isInaccessibleViaGeneratedCode()代码如下:
  | 大专栏  ButterKnife的使用及其解析="code">
  | 
其中,parseResourceAnimation()中isBindingInWrongPackage()代码如下:
  | 
  | 
ButterKnife的bind()运行在UI线程,在指定的Activity中注释变量和方法,当前的内容视图被用作根视图。
  | 
  | 
接下来查阅createBinding()代码:
  | 
  | 
下面查阅findBindingConstructorForClass()代码:
  | 
  | 
而上段代码中多次出现的BINDINGS是什么样的数据结构呢?
  | 
  | 
在上问分析中已经生成了<类名>_ViewBinding的类,下面分析<类名>_ViewBinding类中的代码:
  | 
  | 
下面查阅Utils中的findRequiredViewAsType():
  | 
  | 
下面查阅Utils中findRequiredView()代码:
  | 
  | 
下面查阅Utils中castView()代码:
  | 
  | 
原文:https://www.cnblogs.com/lijianming180/p/12268257.html