一.什么是注解式框架
Android 中写控制的处理代码,比如写一个Button 的onClick处理代码,传统的写法是
Button mLoginButton;
mLoginButton= (Button)findViewById(R.id.loginButton);
如果一个Activity下十几个控件都要这么写一下.实在是一个没有技术含量的辛苦活.现在有如下写法,看起来简单多了.
@BindView(R.id.loginButton)Button mLoginButton;
但有人说这样写没省多少功能啊,现在如果有一个插件能自动写上述@bindView的写法呢,这样是不是简化太多了?
这个针对AS框架称为Butterknife, 源码在此 https://github.com/JakeWharton/butterknife
这里因为使用注释符号@来扩展,并没有改变java语法,因此称为注解式框架.它在编译就进行转换,因此不会影响使用性能.
而协助生成Butterknife的语句的as插件称为 android butterknifte zelezny,源码在此
https://github.com/avast/android-butterknife-zelezny
另外一个常见的辛苦活是写onClick绑定事件
mLoginButton.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
//do something...
}
}) );
当然在新的Android中可以直接在布局中指定onClick方法名
<Button android:id="@+id/loginButton"
android:onClick="onLoginClick">
在对应窗口定义相应的方法即可
public void onLoginClick(View view){
...
}
另一种做法是用@click的事件绑定
@OnClick(R.id.loginButton)
public void onLoginClick(Button button) {
}
//多个控件绑定一个事件
@OnClick(R.id.button1,R.id.button2,R.id.button3)
public void onButtonClick(Button button) {
}
这是就是Butterknife设计思路,这里有一个腾讯Bugly 写的文章,也原理解释更清楚
<<深入理解 ButterKnife,让你的程序学会写代码>>
https://zhuanlan.zhihu.com/p/21628698
二.在项目导入Butterknife
2.1 安装android butterknifte zelezny 插件
Mac 打AS的-->Preferences-->Plugins
搜索android butterknifte zelezny ,点击Install安装,然后重启as,即可安装好
Paste_Image.png
2.2 在项目文件加入对butterknifte的引用
网上都针对7.xxx版本的说明,现在bk已经更新到8.2.1了.
项目的根目录了build.gradle修改
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' #加上这一句
}
}
app下的build.gradle 加入
apply plugin: 'android-apt' #加入这一句
android {
...
}
dependencies {
compile 'com.jakewharton:butterknife:8.2.1' #加入这一句
apt 'com.jakewharton:butterknife-compiler:8.2.1'#加入这一句
}
同步后项目即引用,如果库项目中使用BK,需要特殊写法,具体看
https://github.com/JakeWharton/butterknife/blob/master/README.md 说明
2.3 项目中使用插件
右键点击Activity的setContentView(R.layout.activity_activity);中的布局名.
再点击菜单中的右击,选择 Generate
然后Generate ButterKnife Injections,这时候生成类似于下列的选择框:
最终生成代码是
@BindView(R.id.leftButton)ImageButton leftButton;
@BindView(R.id.titleText)TextView titleText;
@BindView(R.id.rightButton)ImageButton rightButton;
@BindView(R.id.progress_circle)CircleProgressBar progressCircle;
@BindView(R.id.realtime_steps)TextView realtimeSteps;
@BindView(R.id.chartPanel)RelativeLayout chartPanel;
@BindView(R.id.cardlist)ListView cardlist;
完整操作可以看官方演示的Gif动画
https://github.com/avast/android-butterknife-zelezny/raw/master/img/zelezny_animated.gif
生成@bind代码后,会自动在setContentView 语句后加入
ButterKnife.bind(this); 让其生效,如果没有这一句,可手动插入
网友评论