Butter Knife意思是“黄油小刀”,但是在Android社区中,它是由Square.Inc的大牛Jake Wharton设计的视图注入式库。Butter Knife 是一个专注于 Android 系统 View 的注入框架,让你从烦人的 findViewById 中解脱出来。同时还支持 View 的一些事件处理函数。项目地址:http://jakewharton.github.io/butterknife/
如果你不想写一大堆像下面这样的代码:
class ExampleActivity extends Activity {
TextView title;
TextView subtitle;
TextView footer;
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
title = (TextView) findViewById(R.id.title);
subtitle = (TextView) findViewById(R.id.subtitle);
footer = (TextView) findViewById(R.id.footer);
// TODO Use views...
}
}
使用 @InjectView 来注解字段,并为Butter Knife提供视图的id来查找和在转换布局中相应的视图。
class ExampleActivity extends Activity {
@InjectView(R.id.title) TextView title;
@InjectView(R.id.subtitle) TextView subtitle;
@InjectView(R.id.footer) TextView footer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
ButterKnife.inject(this);
// TODO Use "injected" views...
}
}
不用担心Butter Knife会低效的放射机制,事实上会生成视图查找的代码。调用 inject 委托生成如下可以查看和调试的代码。
以上示例会差不多生成如下等价的代码:
public void inject(ExampleActivity activity) {
activity.subtitle = (android.widget.TextView) activity.findViewById(2130968578);
activity.footer = (android.widget.TextView) activity.findViewById(2130968579);
activity.title = (android.widget.TextView) activity.findViewById(2130968577);
}
Butter Knife 的特性:
支持 Activity 中的 View 注入
支持 View 中的 View 注入
支持 View 事件回调函数注入
后面会慢慢介绍这些特性。