1、导入依赖项:Project Structure→app→Dependencies→add→Library Dependence然后搜索ButterKnife导入对应的依赖。本文用的是8.4.0
2、Project的build.gradle文件中增加classpath内容:
dependencies { classpath 'com.android.tools.build:gradle:2.0.0' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //增加这一句butterknife }
3、app的build.gradle文件中增加classpath内容:
apply plugin: 'android-apt'
dependencies {中增加
compile 'com.jakewharton:butterknife:8.4.0' // compile 'com.jakewharton:butterknife-compiler:8.4.0' //这句不能要,否则会有冲突 apt 'com.jakewharton:butterknife-compiler:8.4.0'//增加这一句然后点击“Sync Now”
4、将鼠标移到代码中的布局的位置,摁快捷键“Alt+Insert”弹出对话框,点击“Generate ButterKnife Injections”,选择相应的控件。
使用时注意:1.@BindView 变量名不能是 private 或 static
2.资源绑定时,@BindDrawable等只能放在类的成员变量中,不能放在方法中
3.Activity ButterKnife.bind(this);必须在setContentView();之后,且父类bind绑定后,子类不需要再bind
.Fragment ButterKnife.bind(this, mRootView);
4.在Fragment中,由于与Activity的生命周期不同,有时需解绑ButterKnife
public void onDestroyView(){ |
super.onDestroyView(); |
ButterKnife.unbind(this); |
} |
资源绑定:
通过注解的方式,把资源绑定到对应变量上。需要传入资源的id,并且不同的资源类型要使用不同的注解
class ExampleActivity extends Activity { |
@BindString(R.string.title) String title; |
@BindDrawable(R.drawable.graphic) Drawable graphic; |
@BindColor(R.color.red) int red; |
@BindDimen(R.dimen.spacer) Float spacer; |
// ... |
} |
例如:iv_collect.setImageResource(R.drawable.collect_pressed);
可以写成: | @BindDrawable(R.drawable.collect_pressed) Drawable drawable;//写在类的成员变量中 |
iv_collect.setImageDrawable(drawable); //写在方法中 |
View列表
可以一次性将多个views绑定到一个List或数组中:
@Bind(R.id.first_name,R.id.middle_name,R.id.last_name) |
List<EditText> nameViews; |
点击事件注入:
@OnClick(R.id.submit) |
public void sayHi(Button button){ |
button.setText("Hello"); |
} |
多个控件具有相同的事件:
@OnClick({ R.id.btn1, R.id.btn2, R.id.btn3 }) |
@OnClick({R.id.iv_left, R.id.tv_count, R.id.iv_right,R.id.iv_back}) public void onClick(View view) { switch (view.getId()) { case R.id.iv_left: break; case R.id.tv_count: break; case R.id.iv_right: break; case R.id.iv_back: finish(); break; } }
可选绑定:
默认情况下,@bind和监听器绑定都必须有一个目标view,当butter knife找不到对应的view时会抛出一个异常。为了防止这种异常情况的发生,可以在绑定的字段前面使用@Nullable注解,在绑定的方法前面则可使用@Option注解,来表明对应的是一个可选绑定。
ButterKnife基本使用(二)-在library中的使用
ButterKnife在最近一次更新8.2.1中刚刚支持在Library内部使用视图注入,只要R换成R2就好了。
在实际使用中遇到的问题:
1.library 项目中使用butterknife时,R.id.iv_back,底下会有红线,提示“元素值必须为常量表达式”
原因:在一般的Android项目中,R类的常量都是用final定义的,但ADT 14之后,如果在library 项目中,它会没有final关键字,在这里要用R2.id.iv_back,用R2时,会提示“程序包R2不存在”,多rebuild几遍就行了。
2.在 library 项目中,有多个onclick点击事件,不能使用case R.id.iv_back,与上面报一样的错误,原因也同上。
在switch语句的case中,如果使用 R.id.xxx 则会提示有问题,不允许非常量在case语句中。Google提供的一个方法就是把它转化为if-else语句,即在switch语句处 Ctrl+1 然后可以替换成if-else.语句。