一、ButterKnife是啥
注解中相对简单易懂的很不错的开源框架
1. 强大的View绑定和Click事件处理功能,简化代码,提升开发效率 2. 方便的处理Adaper里的ViewHolder绑定问题 3. 运行时不会影响app效率,使用配置方便 4. 代码清晰,可读性强github开源地址:
二、使用步骤
2.1 添加插件
File -> Settings -> Plugins -> 搜索ButterKnife,找到Android ButterKnife Zeleany进行安装重启AndroidStudio
2.2 添加依赖
在对应module的build.gradle里面添加下面的依赖,重新编译就会自动下载
dependencies {
compile 'com.jakewharton:butterknife:8.5.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}
注意和Dagger2配合使用需要注意把annotationProcessor改为apt。
2.3 在Activity中使用
2.3.1 使用插件
在R.layout.activity_main上面右击 选择Generate -> Generate ButterKnife injections,即可选择 生成view对应的注解,还支持ViewHolder和OnClick
2.3.2 手动
- 绑定ButterKnife
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//绑定初始化ButterKnife
ButterKnife.bind(this);
}
- 定义View
下面的代码把R.id.tv_test这个TextView定义了为tvTest,注意类型不能为static或者private
@BindView(R.id.tv_test)
TextView tvTest;
//当然写成一行也是可以
@BindView(R.id.tv_test) TextView tvTest;
- 点击事件
添加注解@OnClick(R.id.xx)即为点击方法,对应的View参数可有可无,如果有多个参数可以只加一个参数(例如onItemClick有四个参数,你可以只加一个int position的参数)。如果参数错误,编译的时候会报错。
@OnClick(R.id.bt_test)
public void onClick(View v) {
tvTest.setText("被点击了...");
}
如果定义为指定的类型,将会自动转换
@OnClick(R.id.bt_test)
public void onClick(Button button) {
tvTest.setText("被点击了...");
}
更多事件看下面的 三
2.4 在Fragment中使用
在Fragment中使用和在Activity中使用,只是有一点不一样:在获取View的时候,加多一个view参数把View绑定到ButterKnife就行了。
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_fragment, container, false);
//这里需要加多一个参数view
ButterKnife.bind(this, view);
return view;
}
Fragment生命周期和activity有点不同,销毁的时候可以进行解绑
public class MyFragment extends Fragment {
@BindView(R.id.bt_test)
Button btTest;
private Unbinder unbinder;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_fragment, container, false);
//绑定的时候返回了一个Unbinder对象
unbinder = ButterKnife.bind(this, view);
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
}
2.5 在Adapter ViewHolder中使用
把ViewHolder加一个构造方法,在new ViewHolder的时候把view传递进去。
static class ViewHolder {
@BindView(R.id.tv_item_test)
TextView tvItemTest;
@BindView(R.id.bt_item_test)
Button btItemTest;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
item里面Button控件的点击事件也可以使用注解@OnClick来实现,在适配器里面添加就行,如:
//item的button的点击事件
@OnClick(R.id.bt_item_test)
void onClick(){
Toast.makeText(context,"点击了按钮",Toast.LENGTH_SHORT).show();
}
static class ViewHolder {
@BindView(R.id.tv_item_test)
TextView tvItemTest;
@BindView(R.id.bt_item_test)
Button btItemTest;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
注意: 如果item里面有Button等这些有点击的控件事件的,需要设置这些控件属性focusable为false