ButterKnife简介
ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤。是大神JakeWharton的力作,目前使用很广。最重要的一点,使用ButterKnife对性能基本没有损失,因为ButterKnife用到的注解并不是在运行时反射的,而是在编译的时候生成新的class。项目集成起来也是特别方便,使用起来也是特别简单。
ButterKnife优势
1、强大的View绑定和Click事件处理功能,简化代码,提升开发效率
2、方便的处理Adapter里的ViewHolder绑定问题
3、运行时不会影响APP效率,使用配置方便
4、代码清晰,可读性强
ButterKnife版本注意
ButterKinfe的注解标签因版本不同而有所变化:
8.0.0之前的Bind标签在8.0.0之后变成了BindView。
而8.7.0之后在依赖的library中的activity中绑定view时,要用R2.id.XXX,而不再是常用的R.id.XXX,如果是直接在应用的activity中使用,R和R2两者没什么区别。
Note:网上说使用R2是因为library中的R字段的id值不是final类型的, 但是你的应用module中确是final类型的,所以在自己的应用中使用R和R2区别不大个人认为。
ButterKnife使用注意
1.使用ButterKnife修饰的方法和控件,不能用private or static 修饰。
否则会报错:错误: @BindView fields must not be private or static
2.在Activity 类中绑定:ButterKnife.bind(this);必须在setContentView();之后绑定,且父类bind绑定后,子类不需要再bind。
3.在非Activity 类(例如:Fragment、ViewHold)中绑定:ButterKnife.bind(this,view);这里的this不能替换成getActivity()。
4.在Activity中不需要做解绑操作,在Fragment 中必须在onDestroyView()中做解绑操作。
ButterKnife的配置
1、如果你是直接在app中使用,只需在app的 build.gradle 中添加如下代码:
dependencies {
compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}
2、如果是在项目依赖的Library库中使用,那么按照GitHub上的配置会报错,参考博客https://blog.csdn.net/zyw0101/article/details/80399225的解决方案如下:
1.在Project的build.gradle文件中添加:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1' //添加这一行
}
}
这里注意butterknife的版本,8.8.1如果用不了,降低版本至8.5.1才可以使用,具体参见上面博客地址。
2.在App的 build.gradle 中添加如下代码:
apply plugin: 'com.jakewharton.butterknife'
dependencies中添加:
compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
注意:如果是组件化开发,在module工程里面必须引用(包括主app模块)
annotationProcessor 'com.jakewharton:butterknife-compiler:8.x.x'
不然会出现控件绑定失效,导致OnClick等这样的事件无法实现
ButterKnife的使用示例
1.在Activity中使用:ButterKnife.bind(this);
- 由于每次使用都要在Activity中的onCreate绑定Activity,因此个人建议在项目的BaseActivity中完成绑定,子类继承即可
- 必须在setContentView();之后绑定。
2.在Fragment中使用:ButterKnife.bind(this, view); 然后在onDestroyView回调中调用它的unbind方法进行Fragment解绑。
3.在ViewHolder中使用:ButterKnife.bind(this, view);
在Adapter的ViewHolder中使用,将ViewHolder加一个构造方法,在new ViewHolder的时候把view传递进去。
static class ViewHolder {
@BindView(R.id.title)
TextView name;
@BindView(R.id.job_title)
TextView jobTitle;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
4.绑定点击事件
@OnClick({R.id.login_btn_login})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.login_btn_login:
break;
default:
break;
}
}
// 单个组件点击事件的简洁写法,可以不带参数
@OnClick(R2.id.button1 ) //给 button1 设置一个点击事件
public void showToast(){
Toast.makeText(this, "is a click", Toast.LENGTH_SHORT).show();
}
5.ViewPager的监听:
@OnPageChange(R.id.viewpager)
public void onPageSelected(int position) {
switch (position) {
case 0:
break;
case 1:
break;
}
}
ButterKnife的混淆配置
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}
使用ButterKnife插件进行一键初始化
打开android的plugins中心,搜索butterknife
点击browse repo,下载前两个插件都可以,一般下载评分高的即可。
下载完成后需重启AS,回到activity代码的setContentview处,右键布局文件名,注意一定要把光标停在布局文件名上
选择Generate,这时可以看到生成butterknife注解的选项,如果光标不放在布局文件名上,则看不到该选项。
点击生成butterknife注解
插件将布局文件中的所有id都加载出来了,还可以设置点击事件,点击confirm即可快速初始化控件,非常方便。
@BindView(R.id.tv_test1)
TextView tvTest1;
@BindView(R.id.btn_test1)
Button btnTest1;
@BindView(R.id.et_test1)
EditText etTest1;
@BindView(R.id.lv_test1)
ListView lvTest1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_butter_knife_test);
ButterKnife.bind(this);
tvTest1.setText("文本控件已被初始化");
btnTest1.setText("按钮被初始化");
}
@OnClick(R.id.btn_test1)
public void onViewClicked() {
btnTest1.setText("我被点击了");
tvTest1.setText("天若有情天亦老");
}
效果与手动注解一样,对于安卓开发工作者来说,这个插件确实是个神器,节省了大量初始化控件的时间。