转载请标明出处:
http://blog.csdn.net/mr_lawen/article/details/53096142
ButterKnife的优势
1. 强大的View绑定和onClick事件处理功能
2. 简化代码,提高开发效率
ButterKnife的使用
添加jar包
在Android Studio中的File -> Project Structure -> Dependencies -> Library dependency下,搜索butterknife,这里使用的是8.4.0的版本。
注意:如果是在Library项目中要使用如下步骤,否则找到的View为null.
1. 在根目录下build.gradle文件中添加:
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
- 在module下的build.gradle文件中添加:
apply plugin: 'android-apt'
dependencies {
apt 'com.jakewharton:butterknife-compiler:8.4.0'
}
常见使用方法
首先要在Activity的onCreate()方法中绑定Activity,通过ButterKnife.bind(this)来绑定,需要注意的是,该语句要放在setContentView()方法之后。同理,在fragment中,需要在inflate之后调用ButterKnife.bind(this, view)方法。另外绑定属性时,不能用private或者static修饰,否则会报错。
绑定View
@BindView(R.id.textView)
TextView textView;
@BindView(R.id.btn)
Button btn;
绑定资源
@BindString(R.string.app_name)
String str;
@BindDrawable(R.mipmap.ic_launcher)
Drawable drawable;
@BindColor(R.color.red)
int color;
点击事件的绑定
可以不用声明View,不用setOnClickLisener(),就可实现点击事件
a. 直接绑定一个方法
@OnClick(R.id.btn)
void doClick() {
btn.setText("已经点击");
}
b. 多个View统一处理同一个点击事件
@OnClick({R.id.textView,R.id.btn})
void doClick(View view) {
switch (view.getId()) {
case R.id.textView:
textView.setText("点击的是TextView");
break;
case R.id.btn:
btn.setText("点击的是Button");
break;
}
}
对一组View进行统一操作
a将一组view添加到集合或数组中
@BindViews({R.id.textView,R.id.btn})
List<View> views;
b. Butterknife的apply方法
可以对指定的集合进行View的批量操作,Action和Setter是ButterKnife的内部接口,示例如下:
ButterKnife.apply(views,new ButterKnife.Action<View>(){
@Override
public void apply(@NonNull View view, int index) {
TextView textView = (TextView) view;
textView.setText("hello world");
},”world”
});
ButterKnife.apply(views, new ButterKnife.Setter<View, String>(){
@Override
public void set(@NonNull View view, String value, int index) {
TextView textView = (TextView) view;
view.setText(value);
}
},"world");
ButterKnife的原理
其本质就是注解加反射,在使用butterKnife的时候进行绑定,其实就是获得注解的对象,之后扫描这个对象的字节码的所有的filed和method,符合我们注解的就保存下来。当符合filed的时候,就给filed通过反射赋值,当符合method的时候,就给method对应的id的view设置监听,之后回调method方法。