1. ButterKnife简介
ButterKnife是一个专注于Android系统的View注入框架,它通过在编译期生成class文件,为开发者自动完成findViewById方法的调用,对注解的View进行实例绑定。
ButterKnife最基本的使用方法分为4步:
1.在build.gradle中添加依赖
//Java中使用注解处理器不需要添加这个插件
//kotlin中使用注解处理器需要添加这个插件,否则只能识别java的注解,不能识别kotlin的注解
//kapt插件能够同时识别kotlin注解和java注解
apply plugin: 'kotlin-kapt'
implementation 'com.jakewharton:butterknife:10.1.0'
//kotlin中,添加注解处理器的依赖写法用annotationProcessor
//annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
//kotlin中,添加注解处理器的依赖写法用kapt
kapt 'com.jakewharton:butterknife-compiler:10.1.0'
2.对Activity中的View添加@BindView注解。
@BindView(R.id.tv)
lateinit var tv: TextView
1
2
3.在Activity的onCreate方法中调用setContentView之后,调用ButterKnife.bind(this)对所有的添加了注解的View进行实例绑定。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_recycler_view)
ButterKnife.bind(this)
}
4.在Activity中无需调用findViewById方法对View进行赋值,即可直接使用。
tv.text = "Hello World!!!"
1
本文要实现的功能就是这样一个最基础的简易版ButterKnife。
2. 正文前的说明
Kotlin提供的kotlin-android-extensions插件已经提供了很方便的View自动绑定功能,所以使用Kotlin时是没必要使用ButterKnife的(个人观点)。
本文的目的是介绍和记录在kotlin中APT(Annotation Processing Tool,注解处理器)的使用方法,以及如何使用KotlinPoet自动生成kotlin代码,以及在这期间自己踩得一些坑,如果只关心代码实现,可以直接跳转到最后一章,或者查看源代码。
以下内容纯属个人见解结合网上资料完成。存在错误,实属正常,如有不足,欢迎指正。
3. 自动绑定View的原理
实现View的自动绑定需要3个类之间进行合作。
首先,Activity中提供带绑定的View,同时调用ButterKnife.bind(this)完成绑定。代码见ButterKnife简介中的第三代码段
其次,ButterKnife类中提供静态方法bind(activity:Activity)在该方法中通过反射实例化一个Binding类,同时传入activity作为实例化的参数,这个Binding类与具体传入的Activity类相关(即,一个Activity对应一个Binding类,Binding类的命名规则:ButterKnife_**_Binding,**为Activity的类名)。具体代码如下: