一、简介
-
定义:ButterKnife是一个专注于Android系统的View注入框架
-
优势:
-
View绑定和Click处理
-
使用ButterKnife对性能基本没有损失
- 因为ButterKnife用到的注解并不是在运行时反射的,而是在编译的时候生成新的class
-
-
引入依赖:
-
(1)Step one:在Project的 build.gradle 中添加如下代码:
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.3' classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1' //添加这一行 } }
-
(2)Step two:在App的 build.gradle 中添加如下代码:
apply plugin: 'com.jakewharton.butterknife'
-
(3)Step three:dependencies中添加
compile 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
-
二、使用
1、基本使用
- (1)Activity中绑定
- bind() 一定要在setContentView()之后
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//绑定初始化ButterKnife
ButterKnife.bind(this);
}
}
- (2)在Fragment中绑定
- 通过 Unbinder 对象进行操作
- onCreateView()中绑定(unbinder = ButterKnife.bind(this, view)),onDestroy()中解绑(unbinder.unbind())
public class ButterknifeFragment extends Fragment{
private Unbinder unbinder;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, container, false);
//返回一个Unbinder值(进行解绑),注意这里的this不能使用getActivity()
unbinder = ButterKnife.bind(this, view);
return view;
}
/**
* onDestroyView中进行解绑操作
*/
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
}
- (3)在Adapter中绑定
- 在Adapter的ViewHolder中使用,将ViewHolder加一个构造方法,在new ViewHolder的时候把view传递进去
public class MyAdapter extends BaseAdapter {
@Override public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder;
if (view != null) {
holder = (ViewHolder) view.getTag();
} else {
view = inflater.inflate(R.layout.testlayout, parent, false);
holder = new ViewHolder(view);
view.setTag(holder);
}
holder.name.setText("Donkor");
holder.job.setText("Android");
// etc...
return view;
}
static class ViewHolder {
@BindView(R.id.title) TextView name;
@BindView(R.id.job) TextView job;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
}
2、详细使用
-
(1)绑定View
- 单个控件 @BindView()
@BindView( R2.id.button) public Button button;
- 多个控件 @BindViews()
@BindViews({ R2.id.button1, R2.id.button2, R2.id.button3}) public List<Button> buttonList ;
- 单个控件 @BindView()
-
(2)绑定资源
-
绑定字符串 @BindString()
@BindString(R2.string.app_name) //绑定资源文件中string字符串 String str;
-
绑定字符串里面Array数组 @BindArray()
<resources> <string-array name="city"> <item>北京市</item> <item>天津市</item> <item>哈尔滨市</item> <item>大连市</item> <item>香港市</item> </string-array> </resources>
@BindArray(R2.array.city) //绑定string里面array数组 String [] citys ;
-
绑定Bitmap资源 @BindBitmap()
@BindBitmap( R2.mipmap.bm) //绑定Bitmap 资源 public Bitmap bitmap ;
-
绑定一个颜色值 @BindColor()
@BindColor( R2.color.colorAccent ) //绑定一个颜色值 int black ;
-
-
(3)绑定Event
-
绑定控件点击事件 @OnClick()
@OnClick(R2.id.button1 ) //给 button1 设置一个点击事件 public void showToast(){ Toast.makeText(this, "is a click", Toast.LENGTH_SHORT).show(); }
- 监听事件参数转换
//自定义一个特定类型,它将自动被转换 @OnClick(R.id.submit) public void submit(View view) { // TODO submit data to server... }
@OnClick(R.id.submit) public void sayHi(Button button) { //看括号内参数的变化就明白了 button.setText("Hello!"); }
-
绑定控件长按事件 @OnLongClick()
@OnLongClick( R2.id.button1 ) //给 button1 设置一个长按事件 public boolean showToast2(){ Toast.makeText(this, "is a long click", Toast.LENGTH_SHORT).show(); return true; }
-
指定多个id绑定事件
- 不使用R2绑定,而是用正常的R包
@OnClick({R.id.ll_product_name, R.id.ll_product_lilv, R.id.ll_product_qixian, R.id.ll_product_repayment_methods}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.ll_product_name: System.out.print("我是点击事件1"); break; case R.id.ll_product_lilv: System.out.print("我是点击事件2"); break; case R.id.ll_product_qixian: System.out.print("我是点击事件3"); break; case R.id.ll_product_repayment_methods: System.out.print("我是点击事件4"); break; } }
-
绑定Item项点击事件 @OnItemSelected()
@OnItemSelected(R.id.my_spiner)//默认callback为ITEM_SELECTED void onItemSelected(int position) { Toast.makeText(this, "position: " + position, Toast.LENGTH_SHORT).show(); }
-
三、注意事项
1、在Activity类中绑定
- ButterKnife.bind(this);必须在setContentView();之后绑定
- 父类绑定过之后,子类无需再绑定
- 在Activity中不需要解绑操作
- setContentView()不能通过注解实现(有些其他的注解框架可以)
2、在非Activity类中绑定(Fragment,ViewHolder)
- ButterKnife.bind(this, view);中的this不能换成getActivity();
- 在Fragment中必须在onDestroyView()中做解绑操作