ButterKnife
2017-02-23 本文已影响62人
Mr_不靠谱_先森
ButterKnife是一个注解框架,一般在绑定View的时候使用。不得不说,这个框架"有毒",用了就上瘾,连写个Demo都要去导这个库。大多数同学都用过ButterKnife,可能好多人都停留在findViewById()上。我想说,确实不只是有findViewById()这个功能。不得不承认,在这之前,我对ButterKnife的使用,也只停留在绑定视图和点击事件上。
AndroidAnnotation(AA)与ButterKnife的比较
- 首先从功能上来说,AA提供的注解数量远多于ButterKnife,功能也是无所不包(View的绑定,线程,监听,动画,balabala...)而ButterKnife仅仅提供针对View的注解。
- 其次从两类框架的实现流程上来说,AA在一开始就已经生成了新的代码XXXActivity_,后续的执行都是依赖于新的代码。生成的方法和代码量较多。ButterKnife在编译时也是会生成新的中间工具类,代码量相对于AA来说略少,但是新增了类文件。并且,在运行时,需要通过一点点反射的技术来实现整体的逻辑。
- 第三,从上手成都上来说,AA的前期工作略麻烦一些,并且后期需要手动修改类名(XXX的后面加上下划线)ButterKnife则需要在类中添加ButterKnife.Bind方法来使用绑定功能。AA稍微麻烦一丢丢。
使用方法:
Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png常用的几个注解
Butterknife支持Activity,Fragment,View,Dialog,ViewHolder类内部的View绑定
@Bind
TextView mTextView//最常用的注解,用来绑定View,避免findViewById,也可以用在ViewHolder里,必须是public
@Bind({ R.id.first_name, R.id.middle_name, R.id.last_name })
List<EditText> nameViews//绑定多个view,只能用List不能用ArrayList
@OnClick(R.id.submit)
public void submit(View view) {...}//绑定点击事件,支持多个id绑定同一个方法
@OnItemSelected(R.id.list_view)
void onItemSelected(int position) {...}//selected事件
@OnItemClick(R.id.example_list)
void onItemClick(int position) {...}//itemClick事件
@OnFocusChange(R.id.example)
void onFocusChanged(boolean focused){...}//焦点改变监听
@OnItemLongClick(R.id.example_list)
boolean onItemLongClick(int position){...}//长按监听
@OnPageChange(R.id.example_pager)
void onPageSelected(int position){...}//Viewpager切换监听
@OnTextChanged(R.id.example)
void onTextChanged(CharSequence text)//内容改变监听
@BindInt//用来绑定Integer类型的resource ID
@BindString//用来绑定string.xml里的字符串
@BindDrawable//用来绑定图片
@BindColor//用来绑定颜色
@BindDimen//用来绑定dimens
几点有关ButterKnife的提示,使用时避免踩坑。
- Activity: ButterKnife.bind(this);
- 必须在setContentView();之后,且父类bind绑定后,子类不需要再bind
- Fragment :ButterKnife.bind(this, mRootView);
- 属性布局不能用private 或static 修饰,否则会报错
- setContentView()不能通过注解实现。
- ButterKnife已经更新到版本8.x了,以前的版本中叫做@InjectView,7.x中叫@Bind,而现 在改用叫@BindView。