学而实习之 不亦乐乎

Android 使用 ButterKnife 入门

2023-08-11 07:01:21

虽然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存在,则注入, 不存在,则什么事情都不做。