本博客地址: http://blog.youkuaiyun.com/talentclass_ctt/article/details/52003614
今天写这篇文章的灵感是从之前写的 Android开发之用Bmob实现短信验证码功能 来的,记得当时看官方给的demo时,我注意到没有一大堆findViewById()的东西,而是在变量声明的时候加上注解,如:
<span style="font-size:12px;">@InjectView(R.id.tv_title)
TextView tv_title;</span>
感觉这样很方便,就学习一下,以后写项目的时候也好用上。butterknife是一个支持View注入的框架,用到的注解并不是在运行时反射的,而是在编译的时候生成新的class,所以对性能影响不大,可以放心使用。
那怎么用呢?(以下以ButterKnife6为例,现在已经有8了,我会在文章后面介绍一下不同之处。)
一、跟普通框架一样,下载jar包,导入到项目。
二、想在哪个类使用注解,就在那个类使用ButterKnife.inject()方法。
在Activity用,就在onCreate里面加上ButterKnife.inject(this);
在Fragment用,就在onCreateView里面加上ButterKnife.inject(this, view);
在ViewHolder用,就在构造方法里面加上ButterKnife.inject(this, view);
三、哪些地方能用呢?怎么用?
1、在声明变量的时候在前面加上@InjectView("括号里填id");
注意:变量声明的时候不能为private或者static,所以一般都写缺省,我故意加上private,结果编译时报错:
Android设置监听有一种方式是在xml文件里对应的控件写上 android:onClick="f" ,然后在Activity里面写:
public void f(View view){
// 处理的代码
}
如果用了butterknife,就可以不用在xml里面写onclick,也不用写什么setXXXListener了,直接在Activity里面写:
// 绑定监听器
@OnClick(控件ID)
public void showToast2(View view){// 可以有一个参数View,也可不写
// 处理的代码
}
注意:@InjectView,@OnClick(或其他监听器)默认是NONULL,找不到目标视图时会报错,可以在前面加上@Nullable,这样找不到也不会报错。
3、像Fragment、Adapter这种可以有子布局的控件,在使用ButterKnife.inject()时要再传入一个绑定子布局的view,其他跟上面的一样。在ViewHolder中添加了一个有View参数的构造方法,在重写getView()方法时也不用写findViewById而是直接用了。
4、如果需要在界面销毁的时候,把注入的 View 设置为 Null, 可以用 reset()函数;
四、ButterKnife6和ButterKnife8用法的不同。
一开始我还纳闷怎么有的是@InjectView,有的是@BindView,后来才发现前者是6,后者是7或8,版本不一样。但大同小异,一些细节改一下啊就好了:
把@InjectView换成@BindView
把@InjectViews换成@BindViews
把ButterKnife.inject(this)换成ButterKnife.bind(this)
把ButterKnife.reset(this) 换成 ButterKnife.unbind(this);