(1)ButterKnife是什么?
在开发过程中,我们总是会写大量的findViewById和点击事件,像初始view、设置view监听这样简单而重复的操作让人觉得特别麻烦,当然不会偷懒的程序员不是好程序员,自然也出现了相应的解决方案--依赖注入。而ButterKnife则是依赖注入中相对简单易懂的很不错的开源框架,(其实ButterKnife也不算严格意义上的依赖注入,后面文章中会做分析)。但ButterKnife作为JakeWharton大神写的注解框架被广泛应用于android开发中,自然也有它的过人之处。下面对它的使用过程进行描述。
它的具体优势:
1.强大的View绑定和Click事件处理功能,简化代码,提升开发效率
2.方便的处理Adapter里的ViewHolder绑定问题
3.
运行时不会影响APP效率,使用配置方便
4.代码清晰,可读性强
与缓慢的反射相比,Butter Knife使用再编译时生成的代码来执行View的查找,因此不必担心注解的性能问题。调用bind来生成这些代码,你可以查看或调试这些代码。
配置ButterKnife
Download
dependencies {
compile 'com.jakewharton:butterknife:8.4.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
}
Library projects
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
}}
and then apply it in your module:
apply plugin:'com.jakewharton.butterknife'
ButterKnife使用中有哪些注意的点呢?
注意:
- Activity ButterKnife.bind(this);必须在setContentView();之后,且父类bind绑定后,子类不需要再bind
- Fragment ButterKnife.bind(this, mRootView);
- 属性布局不能用private or static 修饰,否则会报错
- setContentView()不能通过注解实现。
- ButterKnife已经更新到版本7.0.1了,以前的版本中叫做@InjectView了,而现在改用叫@Bind,更加贴合语义。
- 在Fragment生命周期中,onDestoryView也需要Butterknife.unbind(this)
- ButterKnife不能再你的library module中使用哦!!这是因为你的library中的R字段的id值不是final类型的,但是你自己的应用module中确是final类型的。针对这个问题,有人在Jack的github上issue过这个问题,他本人也做了回答,点击这里。
//简单小代码
//适配器中使用
public class MyAdaper extends BaseAdapter { Context context; List<String> list; public MyAdaper(Context context, List<String> list) { this.context = context; this.list = list; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public View getView(int i, View view, ViewGroup viewGroup) { MyHolder holder=null; if(view==null){ view=View.inflate(context,R.layout.aa,null); holder=new MyHolder(view); view.setTag(holder); }else{ holder= (MyHolder) view.getTag(); } holder.tv.setText(list.get(i)); return view; } class MyHolder{ //注解绑定控件 @BindView(R.id.l_tv) TextView tv; //通过有参构造注解绑定布局 public MyHolder(View view) { ButterKnife.bind(this,view); } } }