
ButterKnife 简介
-
ButterKnife是一个专注于Android系统的View注入框架,可以减少大量的findViewById以及setOnClickListener代码,可视化一键生成。
-
项目github地址:https://github.com/JakeWharton/butterknife
-
ButterKnife 优势
- 1、强大的View绑定和Click事件处理功能,简化代码,提升开发效率
- 2、方便的处理Adapter里的ViewHolder绑定问题
- 3、运行时不会影响APP效率,使用配置方便
- 4、代码清晰,可读性强
如何添加依赖
- 在项目的module 的build.gredle 文件中的dependencies标签下添加。

如何使用
-
这里推荐使用插件完成绑定工作
-
zelezny : Butterknife插件的使用
87F45EABCFBCF1F25548A6C3E7576CCD.png
-
-
视图绑定操作


- 注意:必须绑定
ButterKnife.bind(this);
- 通过使用 @BindView 来消除 findViewById
- 将多个 View 组织到一个列表中,一次性操作它们
- 通过使用 @onClick 为 View 绑定监听,消除 listener 的匿名内部类
- 通过使用资源注解如 @BindColor,来消除资源的查找
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过这个问题,他本人也做了回答,点击这里。
ButterKnife原理
- ButterKnife是一个依托Java的注解机制来实现辅助代码生成的框架。反射机制虽然很灵活,但是很慢。
- Annotation processing 是javac中用于编译时扫描和解析Java注解的工具。Annotation processing是在编译阶段执行的,它的原理就是读入Java源代码,解析注解,然后生成新的Java代码。新生成的Java代码最后被编译成Java字节码,注解解析器(Annotation Processor)不能改变读入的Java 类,比如不能加入或删除Java方法
下图是Java 编译代码的整个过程,可以帮助我们很好理解注解解析的过程:

- 开始扫描Java代码中的所有 ButterKnife注解。
- ButterKnifeProcessor --> <className>$$ViewBinder。
- 调用bind 方法加载生成的ViewBinder类。
网友评论