导航
一、代码的演进
二、butterKnife反射调用
三、javapoet自动生成模板代码
四、apt与注解
五、注解支持多层继承
六、apt调试
七、javapoet语法
1、前言
butterknife归根结底:不用手写findviewbyId,用模板自动生成代码,减少不必要重复工作。
与其上手直接写代码,不如阐述渐进的思路,理解会透彻一些。
2、代码演进
1、最初代码
TextView helloTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
helloTv = findViewById( R.id.helloTv );
}
当代码变多后
2、简单封装后代码
TextView helloTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
initView();
}
private void initView(){
this.helloTv = findViewById( R.id.helloTv );
}
3、可以更进一步封装
TextView helloTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
initView(FirstActivity.this, getWindow().getDecorView());
}
private void initView(FirstActivity activity, View view ){
activity.helloTv = view.findViewById( R.id.helloTv );
}
4、可以将初始化控件代码专门抽出一个类
/**
* DO NOT EDIT THIS FILE!!! IT WAS GENERATED BY CHENTONG.
*/
public class FirstActivity_ViewBinding implements Unbinder {
private FirstActivity target;
@UiThread
public FirstActivity_ViewBinding(FirstActivity target, View source) {
this.target = target;
target.helloTv = source.findViewById( R.id.helloTv );
}
@Override
public void unbind() {
target.helloTv = null;
}
}
看此时代码更像一个模板。
调用方式也比较固定死板
TextView helloTv;
Unbinder unbinder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
unbinder = new FirstActivity_ViewBinding(FirstActivity.this, getWindow().getDecorView());
}
@Override
protected void onDestroy() {
super.onDestroy();
unbinder.unbind();
unbinder=null;
}
从一次一次演化,findViewById代码编写,一次比一次趋近于模板化,很套路毫无新鲜感。
日常手头重复的工作,很像模板,是时候开始改变了