Android 使用 ButterKnife 入门
虽然Android已经提供了viewBinding和dataBinding,只需在build.gradle中加入以下配置
buildFeatures {
viewBinding true
dataBinding true
}
即可自动将layout中的控件与类中控件对象绑定。但相比于 dataBinding,ButterKnife作为控件绑定工具,依然有其独有的便捷性。
注意:ButterKnife与Kotlin的冲突,在Kotlin中,如果使用 ButterKnife,在生成的 Binding 类中,Kotlin 会自动将 @BindView 修饰的变量改为private,导致其无法被其它类访问。
因此如果使用Kotlin语言,要避免使用ButterKnife。
一、使用ButterKnife
1、需要在<build.gradle>中添加dependencies
implementation 'com.jakewharton:butterknife:10.1.0'
kapt 'com.jakewharton:butterknife-compiler:10.1.0'
2、在代码中通过如下方式自动绑定控件
引入 layout 布局
Unbinder mUnbinder;
setContentView(R.layout.activity_ocr_clip_edit);
mUnbinder = ButterKnife.bind(this);
绑定控件
@BindView(R.id.root_layout)
View rootLayout;
@BindView(R.id.left_image)
ViewPager leftImage;
@BindView(R.id.right_image)
ViewPager rightImage;
为控件绑定onClick响应
@OnClick({R.id.root_layout, R.id.left_image, R.id.right_image})
public void onClick(View view) {
switch (view.getId()) {
case R.id.left_image:
... ...
break;
}
}
在退出时,务必将绑定释放
mUnbinder.unbind();
所以从某些角度而言,ButterKnife 其实比 ViewBinding 更加便捷
二、常用注解
@BindViews:绑定多个view id 为一个view的list变量 @BindViews({ R.id.first_name, R.id.middle_name, R.id.last_name }) List<EditText> nameViews;
@BindView:绑定一个view id为一个view变量@BindView(R.id.title) TextView title;
@BindArray:绑定String中的array数组 @BindArray(R.array.city)String[] citys;
@BindBitmap:绑定图片资源文件, @BindBitmap(R.mipmap.wifi) Bitmap bitmap;
@BindBool:绑定真假boolean @BindBool(R.bool.boor)
@BindColor:绑定颜色 @BindColor(R.color.red)
@BindDimen:绑定尺寸 @BindDimen(R.dimen.spacer) Float spacer;
@BindDrawable:绑定Drawable @BindDrawable(R.drawable.graphic) Drawable graphic
@BindFloat:绑定Float
@BindInt:绑定Int
@BindString:绑定一个String id为String变量, @BindString(R.string.app_name) String msg
@BindAnim:绑定动画
@BindFont:绑定字体文字
绑定事件,一共有12个事件监听
@OnClick:点击事件
@OnCheckedChanged:选中,选中取消
@OnEditorAction:软键盘的功能按键
@OnFocusChange:焦点改变
@OnItemClick:Item被点击事件(注意这里有坑,如果item里面有Button等这些有点击的控件事件的,需要设置这些控件属性focusable为false)
@OnItemLongClick:tem长按,返回真则可以拦截onItemClick
@OnItemSelected:Item被选择事件
@OnLongClick:长按事件
@OnPageChange:页面改变事件
@OnTextChanged:EditText里面的文本变化事件
@OnTouch:触摸事件
@Optional:选择性注入,如果当前对象不存在,就会抛出一个异常,为了压制这个异常,可以在变量或者方法上加入一下注解,让注入变成选择性的,如果目标View存在,则注入, 不存在,则什么事情都不做。