摘要
在进行Android开发的时候,我们常常使用findViewById() 的方法来引入控件的对象,当需要引入多个对象的时候,使用findViewById() 的方法将会影响我们的开发的速度。所以使用框架来引入控件对象将会变得更加方便。常用的引入框架有两个:ButterKnife 和 AndroidAnnotations 。这里主要介绍ButterKnife的使用。
ButterKnife 功能
(1)绑定控件(Activity、Fragment 和 ViewHolder)
(2)绑定点击事件
(3)绑定资源(颜色、字符串、尺寸、图片…)
(4)定义行为,批量修改控件
ButterKnife在Android Studio工程中的使用方法
1.引入ButterKnife (也可以参考 https://github.com/JakeWharton/butterknife)
(1)首先在project层的gradle 中加入红色框那一句:
(2)在app 层的gradle 中加入红框中的内容:
(3)点击同步工程。待工程同步完成,ButterKnife 算引入成功了,我们就可以使用ButterKnife中的API进行开发。
2. 在Activity 中绑定控件和资源
ButterKnife 利用的是java的反射机制,所以在绑定控件的时候,需要进行初始化,如:
ButterKnife.bind(this); // BUtterKnife的初始化操作,this指代Activity对象
(1) 绑定控件

//绑定一个TextView,作用等同于TextView textView = (TextView) findViewById(R.id.tv);
@BindView(R.id.tv) TextView tv;
(2)在Activity绑定单个资源
绑定颜色资源
//绑定res文件夹中的资源,作用等同于getResources().getColor(R.color.colorAccent,Color.BLUE)
@BindColor(R.color.colorAccent)
int color;
绑定字符串资源:
//绑定字符资源,作用等同于getResources().getString()
@BindString(R.string.app_name)
String appName;
绑定图片资源
//绑定图片资源,作用等同于getResources().getDrawable()
@BindDrawable(R.mipmap.ic_launcher)
Drawable drawable;
绑定尺寸资源
@BindDimen(R.dimen.spacer) Float spacer; //int (for pixel size) or float
当然还可以绑定其它资源,这里不一一罗列了。
(3)绑定多个控件和资源
只需要在把控件的id 使用数组列出来,@BindView 改为 @BindViews即可,如:
//批量绑定控件
@BindViews({R.id.tv1, R.id.tv2, R.id.tv3})
List<TextView> textViews;
3.绑定点击事件
注意:方法名btnClick可以随便取,方法参数 Button btn 也可以任意类型。
//绑定点击事件
@OnClick({R.id.btn1, R.id.btn2}) // 如果只是绑定一个点击事件@OnClick(R.id.btn1)
public void btnClick(Button btn) {
switch (btn.getId()) {
case R.id.btn1:
Toast.makeText(MainActivity.this, "btn1", Toast.LENGTH_SHORT).show();
break;
case R.id.btn2:
Toast.makeText(MainActivity.this, "btn2", Toast.LENGTH_SHORT).show();
break;
}
}
4. 绑定适配器 Adapter 里面的控件
在使用ListView 来加载数据的时候,往往需要自定义适配器,在自定义的item布局中也可以使用ButterKnife来对控件进行绑定。
// convertView = inflater.inflate(R.layout.item, parent, false);
// holder = new ViewHolder(convertView);
class ViewHolder {
@BindView(R.id.tv) TextView tv;
public ViewHolder(View itemView) {
//第二个参数表示去哪一个布局文件中查找对应的控件
ButterKnife.bind(this,itemView);
}
}
需要注意的是,初始化ButterKnife的时候需要加上View。
5. 绑定Fragment 里面的控件和点击事件
初始化:
// View view = inflater.inflate(R.layout.fg_layout, container, false);
ButterKnife.bind(this, view);
绑定控件和点击事件:
// 绑定 TextView
@BindView(R.id.tv)
TextView tv;
//绑定点击事件
@OnClick(R.id.fg_btn)
public void fgBtnClick(View view) {
Toast.makeText(getActivity(), "tttttt", Toast.LENGTH_SHORT).show();
}
6. Android ButterKnife Zelezny(直接在as插件中搜索)
这是ButterKnife的一款插件,可以快速绑定地控件。安装完成即可使用。
使用方法:
选择需要绑定的控件,然后点击Confirm即可。如下:
引入效果如下:
@BindView(R.id.btn1) Button btn1;
@BindView(R.id.btn2) Button btn2;
@BindView(R.id.btn3) Button btn3;
@BindView(R.id.btn4) Button btn4;
@BindView(R.id.tv1) TextView tv1;
@BindView(R.id.et1) EditText et1;
7.快速地给多个控件添加行为,如TextView修改文字大小,颜色等
(1) 首先绑定需要修改的多个控件:
//批量初始化控件
@BindViews({R.id.tv1, R.id.tv2, R.id.tv3})
List<TextView> textViews;
(2)定义修改文字大小的行为
//定义一个修改文本大小的行为
ButterKnife.Action<TextView> CHANGETEXTSIZE = new ButterKnife.Action<TextView>() {
@Override
public void apply(@NonNull TextView view, int index) {
// index代表第几个控件
view.setTextSize(36);
}
};
(3)定义修改颜色的行为
//定义一个可传参的行为,其中List<Integer> 放置的是颜色的集合
ButterKnife.Setter<TextView,List<Integer>> CHANGETEXTCOLOR = new ButterKnife.Setter<TextView, List<Integer>>() {
@Override
public void set(@NonNull TextView view, List<Integer> value, int index) {
view.setTextColor(value.get(index));
}
};
(4)应用所定义的行为
// 应用修改文字大小的行为
ButterKnife.apply(textViews,CHANGETEXTSIZE);
// 应用修改颜色的行为
ButterKnife.apply(textViews,CHANGETEXTCOLOR,textColors);