为什么要用ButterKnife?
方便处理View绑定和Click事件,简化代码,提升开发效率。
1. 引用依赖
- 找到自己项目的build.gradle(Modul: app) 并添加
dependencies{
compile 'com.jakewharton:butterknife:8.5.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}
2 添加插件
添加插件 ButterKnife,选择 Zelezny
(主要用于快捷生成注解)2-1 点击File => Setting打开设置
2-2 选择plugins(插件),并在下方选择Browse repositories(民间插件)
(下面3个按钮分别代表 官方、民间、本地的插件,我们这里选择第2个)
- 2-3 输入Zelezny,点击右侧安装即可,很明显第一个就是我们需要的插件,点击安装后,可能会提示重启AS,点击OK即可
3 使用
- 3-1 在Activity中使用
在ActivityonCreate() 中setContentView下面添加(可以放在BaseActivity中)
setContentView(R.layout.activity_main);
//绑定butterknife
ButterKnife.bind(this);
- 3-2 在Fragment中使用
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_butterknife, container, false);
//绑定fragment
ButterKnife.bind( this , view ) ;
return view ;
}
- 3-3 绑定单个、多个View
@BindView(R.id.tv)
TextView tv;
@BindViews({ R.id.button1 , R.id.button2 , R.id.button3 })
public List
相当于TextView tv = findViewById(R.id.tv)
- 3-5 绑定资源
@BindString() :绑定string 字符串
@BindArray() : 绑定string里面array数组
@BindBitmap( ) : 绑定Bitmap 资源
@BindColor( ) : 绑定一个颜色值
@BindString( R.string.app_name ) //绑定string 字符串
String meg;
@BindArray(R.array.city ) //绑定string里面array数组,要预先准备好数组
String [] citys ;
@BindBitmap( R.mipmap.wifi ) //绑定Bitmap 资源
public Bitmap wifi_bitmap ;
@BindColor( R.color.colorAccent ) //绑定一个颜色值
int black ;
- 3-6 绑定单个、多个View点击事件 (长按事件)
@OnClick(R.id.btn)
public void onBtnClicked() {}
@OnClick({ R.id.tv_text1, R.id.tv_text2, R.id.tv_text3, R.id.tv_text4 })
public void onBtnClicked() {}
@OnLongClick( R.id.button1 )
public void onLongClicked() {}
相当于省略了给每个View设置setOnclickListener
- 3-7 Adapter中的使用
在ViewHolder里首先绑定控件,然后新建构造方法,接受传过来的View
此外,item里面Button控件的点击事件也可以使用注解@OnClick来实现
>传统ListView的Adapter:
其实只需要注意 holder = new ViewHolder(convertView); 即可
public class TestAdapter extends BaseAdapter {
private List list;
private Context context;
public TestAdapter(Context context, List list) {
this.list = list;
this.context = context;
}
@Override
public int getCount() {
return list==null ? 0 : list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.layout_list_item, null);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//item的button的点击事件
@OnClick(R.id.hello_world)
public void onClick(){
Toast.makeText(context,"点击了按钮",Toast.LENGTH_SHORT).show();
}
return convertView;
}
static class ViewHolder {
@BindView(R.id.hello_world)
TextView textview;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
}
> RecyclerView的Adapter:
@Override
public MainHodler onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main, parent, false);
return new MainHodler(view);
}
4 自动生成快捷键
- 若在Activity中,鼠标移至布局文件
使用快捷键 Alt+Insert,再选择Butterknife Injections自动生成
- 可以看到布局中定义的控件都会被绑定
我们可以自由绑定、更改变量名、以及设置onClick
5 使用注意
1.Activity ButterKnife.bind(this);必须在setContentView();之后,且父类bind绑定后,子类不需要再bind
2.Fragment ButterKnife.bind(this, mRootView);
3.属性布局不能用private or static 修饰,否则会报错
6 致谢:
参考文章:
https://www.cnblogs.com/Westfalen/p/6742946.html
http://www.jianshu.com/p/63e1690c83e5
http://blog.csdn.net/zhuhai__yizhi/article/details/50777067