ButterKnife的介绍
ButterKnife是一个支持View注入的框架。通常要写很多findViewById来初始化View对象,有了ButterKnife可以很轻松的省去这些步骤。ButterKnife是大神JakeWharton的力作,目前使用很广。最重要的一点,使用ButterKnife对性能基本没有损失,因为ButterKnife用到的注解并不是在运行时反射的,而是在编译的时候生成新的class。本文中ButterKnife的版本是v7.0.1。官方网址:http://jakewharton.github.io/butterknife/
使用时应注意
Activity ButterKnife.bind(this)
;必须在setContentView()
;之后,且父类bind绑定后,子类不需要再bindFragment ButterKnife.bind(this, mRootView)
;- 属性布局不能用
private or static
修饰,否则会报错 setContentView()
不能通过注解实现。(其他的有些注解框架可以)
使用方法:
- 如果使用Eclipse,可以去官网下载jar包导入
- 如果使用AndroidStudio可以直接在gradle中添加依赖
compile 'com.jakewharton:butterknife:7.0.1'
在Activity中绑定
public class MainActivity extends AppCompatActivity{
//给指定的TextView绑定id
@Bind(R.id.tv)
TextView tv;
//给指定的Button绑定id
@Bind(R.id.btn)
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
tv.setText("哈哈");
btn.setText("呵呵呵");
}
}
注意:需要绑定的控件不能是private和static的
在Fragment中绑定
public class BlankFragment extends Fragment{
@Bind(R.id.f_tv)
TextView f_tv;
@Bind(R.id.f_btn)
Button f_btn;
public BlankFragment(){
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState){
View view=inflater.inflate(R.layout.fragment_blank, container, false);
ButterKnife.bind(this, view);
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
ButterKnife.unbind(this);//解绑
}
}
在ViewHolder中绑定
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.layout_list_item, null);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.textview.setText("item=====" + position);
return convertView;
}
static class ViewHolder {
@Bind(R.id.hello_world)
TextView textview;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
!注意:我们在ViewHolder中添加了一个有View参数的构造方法,以后再也不需要在getView方法中findViewById了
绑定事件回调方法
@OnClick({R.id.btn})
public void ok(){ //方法形参列表中可以有View也可以没有
Toast.makeText(this, "点击了Activity中的按钮", Toast.LENGTH_SHORT).show();
}
也可以多个View控件的点击事件绑定在一个方法中。除了点击事件@OnClick
,还有ListView
的点击@OnItemClick, CheckBox
的@OnCheckedChanged
等等.
ButterKnife一些其他常用方法
1、解除绑定
@Override
protected void onDestroy(){
super.onDestroy();
//解绑。 即把上面绑定的view全部置为null
ButterKnife.unbind(this);
}
2、选择性绑定。
默认情况下绑定View和事件的时候,控件的id是必须存在的,否则会抛出异常。 选择性绑定可以做到如果id存在就绑定,否则不绑定,不抛出任何异常。 想达到这样的想过只需要在@bind 或@onClick前添加@null即可
@Nullable @Bind(R.id.f_tv)
TextView tv;
3、多方法绑定
@OnItemSelected(R.id.list_view)
void onItemSelected(int position) {
// TODO ...
}
@OnItemSelected(value = R.id.maybe_missing, callback = NOTHING_SELECTED)
void onNothingSelected() {
// TODO ...
}
4、findById方法。以前我们调用findViewById需要进行强制类型转换。使用它可以免除强制类型转换,可以自动完成类型转换。
View view = LayoutInflater.from(context).inflate(R.layout.thing, null);
TextView firstName = ButterKnife.findById(view, R.id.first_name);
TextView lastName = ButterKnife.findById(view, R.id.last_name);
ImageView photo = ButterKnife.findById(view, R.id.photo);
AndroidStudio 中Zelezny插件的使用
使用此插件让butterknife
用起来更加方便,在AndroidStudio->File->Settings->Plugins->搜索Zelezny下载添加就行 ,可以快速生成对应组件的实例对象,不用手动写。使用时,在要导入注解的Activity 或 Fragment 或 ViewHolder的layout资源代码上,右键——>Generate——Generate ButterKnife Injections,然后就出现如图的选择框。下图为操作过程: