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