ButterKnife 简介
ButterKnife是一个专注于Android系统的View注入框架,可以减少大量的findViewById以及setOnClickListener代码,可视化一键生成。
ButterKnife 优势
1、强大的View绑定和Click事件处理功能,简化代码,提升开发效率
2、方便的处理Adapter里的ViewHolder绑定问题
3、运行时不会影响APP效率,使用配置方便
4、代码清晰,可读性强
使用心得:
- Activity ButterKnife.bind(this);必须在setContentView();之后,且父类bind绑定后,子类不需要再bind
- Fragment ButterKnife.bind(this, mRootView);
- 属性布局不能用private or static 修饰,否则会报错
- setContentView()不能通过注解实现。(其他的有些注解框架可以)
如何添加依赖:
在项目的project 的build.gradle 文件中的dependencies标签下添加
classpath 'com.jakewharton:butterknife-gradle-plugin:8.7.0'
例如:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'com.jakewharton:butterknife-gradle-plugin:8.7.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
在module的build.gradle 文件中添加
apply plugin: 'com.jakewharton.butterknife'
在module的build.gradle 文件中的dependencies标签中添加
compile 'com.jakewharton:butterknife:8.7.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.7.0'
例如:
apply plugin: 'com.android.application'
apply plugin: 'com.jakewharton.butterknife'
android {
compileSdkVersion 25
buildToolsVersion "25.0.3"
defaultConfig {
applicationId "com.example.wangzl.bufferknifedemo"
minSdkVersion 21
targetSdkVersion 25
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.jakewharton:butterknife:8.7.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.7.0'
}
使用:
在Activity中使用
public class MainActivity extends AppCompatActivity {
@BindView(R.id.btn_1)
Button btn1; //按钮1
@BindView(R.id.btn_2)
Button btn2; //按钮2
@BindView(R.id.btn_3)
Button btn3; //按钮3
// 注意:button 的修饰类型不能是:private 或者 static 。 否则会报错:错误: @BindView fields must not be private or static
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//绑定目标activity
ButterKnife.bind(this);
}
@OnClick({R.id.btn_1, R.id.btn_2, R.id.btn_3})
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_1:
ToastUtil.showMsg(this, "点击了按钮1");
break;
case R.id.btn_2:
ToastUtil.showMsg(this, "点击了按钮2");
break;
case R.id.btn_3:
ToastUtil.showMsg(this, "点击了按钮3");
break;
}
}
}
在非Activity中使用绑定
例如在Fragment中:
public class FancyFragment extends Fragment {
@BindView(R.id.button1) Button button1;
@BindView(R.id.button2) Button button2;
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fancy_fragment, container, false);
ButterKnife.bind(this, view);
// TODO Use fields...
return view;
}
}
还有一种比较常见的场景,就是在ListView的Adapter中,我们常常会使用ViewHolder:
public class MyAdapter extends BaseAdapter {
@Override public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder;
if (view != null) {
holder = (ViewHolder) view.getTag();
} else {
view = inflater.inflate(R.layout.whatever, parent, false);
holder = new ViewHolder(view);
view.setTag(holder);
}
holder.name.setText("John Doe");
// etc...
return view;
}
static class ViewHolder {
@BindView(R.id.title)
TextView name;
@BindView(R.id.job_title) TextView jobTitle;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
}