ButterKnife框架可以把人们从繁琐的findViewById和setOnClickListener中解放出来,它采用依赖注入的方式,可以通过注解,使layout文件中的View和代码中的对象自动绑定。

ButterKnife
ButterKnife的特点
- 方便的处理View的绑定和点击事件
- 方便的处理ListView/RecycleView中ViewHolder的绑定事件
- 增强代码可读性
ButterKnife的使用
-
在Acitvity中使用
-
在onCreate中
ButterKnife.bind(this) -
在变量前添加注解 - @Bind(view.id)
@Bind(R.id.button) Button button; -
添加响应函数
@onClick(R.id.button) public void submit(){ //TODO }
-
-
在non-activity中使用,例如Fragment
-
在onCreateView中
ButterKnife.bind(this,view) -
在变量前添加注解
@Bind(R.id.title) Button start; -
完整代码
public class FancyFragment extends Fragment { @Bind(R.id.button1) Button button1; @Bind(R.id.button2) Button button2; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ View view = inflater.inflate(R.layout.fancy_fragment, container, false); ButterKnife.bind(this, view); // TODO Use fields... return view; } }
-
-
在Viewholder中使用
-
在ViewHolder的构造函数中
ButterKnife.bind(this,view) -
在变量前添加注解
@Bind(R.id.title) TextView title -
完整代码如下
static class ViewHolder { @Bind(R.id.title) TextView title; public ViewHolder(View view) { ButterKnife.bind(this, view); } }
-
-
资源绑定
通过注解的方式,把资源绑定到对应变量上。需要传入资源的id,并且不同的资源类型要使用不同的注解。
```
class ExampleActivity extends Activity {
@BindString(R.string.title) String title;
@BindDrawable(R.drawable.graphic) Drawable graphic;
@BindColor(R.color.red) int red;
@BindDimen(R.dimen.spacer) Float spacer;
// ...
}
```
通过这种方式,就可以把资源直接赋值给变量,从而不再需要初始化。
-
View列表
可以一次性将多个views绑定到一个List或数组中:
```
@Bind(R.id.first_name,R.id.middle_name,R.id.last_name)
List<EditText> nameViews;
```
我觉得这个功能一点也不实用。
-
事件注入
-
点击事件注入
public void sayHi(Button button){
button.setText("Hello");
}
@OnClick({ R.id.door1, R.id.door2, R.id.door3 })参数是可选的,但如果存在,必须是这个控件类或者控件类的父类。 + ##### 多个控件具有相同的事件
public void pickDoor(DoorView door) {
if (door.hasPrizeBehind()) {
Toast.makeText(this, "You win!", LENGTH_SHORT).show();
} else {
Toast.makeText(this, "Try again", LENGTH_SHORT).show();
}
} -
靠传入函数的参数,判断是是哪个控件触发的事件。参数的类型必须是这些控件的共同父类。
- #### 在Fragment中,由于与Activity的生命周期不同,有时需解绑ButterKnife
```
@override
public void onDestroyView(){
super.onDestroyView();
ButterKnife.unbind(this);
}
-
重置注入
ButterKnife.reset(this);