上一期我们已经把butterknife-annotations中的注解变量都已经定义好了,分别为BindView、OnClick与Keep。
如果你是第一次进入本系列文章,强烈推荐查看
《android开发教程:自定义注解之如何实现注解变量》这篇文章,要不然你可能会有点云里雾里。
如果在代码中引用的话,它将与开源库ButterKnife的操作类似。
reasonml
class MainActivity : AppCompatActivity() {
@BindView(R.id.public_service, R.string.public_service)
lateinit var sName: TextView
@BindView(R.id.personal_wx, R.string.personal_wx)
lateinit var sPhone: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Butterknife.bind(this)
}
@OnClick(R.id.public_service)
fun nameClick(view: View) {
Toast.makeText(this, getString(R.string.public_service_click_toast), Toast.LENGTH_LONG).show()
}
@OnClick(R.id.personal_wx)
fun phoneClick(view: View) {
Toast.makeText(this, getString(R.string.personal_wx_click_toast), Toast.LENGTH_LONG).show()
}
}
使用@BindView来绑定我的View,使用@OnClick来绑定View的点击事件。使用Butterknife.bind来绑定该Class,主要是用来实例化自动生成的类。(该部分下篇文章将提及)
我们自己定义的绑定注解库已经完成了1/3,接下来我们将实现它的代码自动生成部分。这时就到了上期提到的第二个Module:butterknife-compiler。
**NameUtils**是一些常量的管理工具类。
arduino
final class NameUtils {
static String getAutoGeneratorTypeName(String typeName) {
return typeName + ConstantUtils.BINDING_BUTTERKNIFE_SUFFIX;
}
static class Package{
static final String ANDROID_VIEW = "android.view";
}
static class Class {
static final String CLASS_VIEW = "View";
static final String CLASS_ON_CLICK_LISTENER = "OnClickListener";
}
static class Method{
static final String BIND_VIEW = "bindView";
static final String SET_ON_CLICK_LISTENER = "setOnClickListener";
static final String ON_CLICK = "onClick";
}
static class Variable{
static final String ANDROID_ACTIVITY = "activity";
}
}
NameUitls包含了自动生成的类名称,包名,方法名,变量名。总之就是为了代码更健全,方便管理。
第二个类Processor是今天的重中之重。也是注解库代码自动生成的核心部分。由于注解的自动生成代码都是在注解进程中进行,所以这里它继承于**AbstractProcessor**,其中主要有三个方法需要实现。
1. init:初始化必要的数据
2. getSupportedAnnotationTypes:所支持的注解
3. process:解析注解,编写自动生成代码
init
从简单到容易,先是init方法,我们直接看代码
aspectj
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
mFiler = processingEnv.getFiler();
mMessager = processingEnv.getMessager();
mEl