本博客介绍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