![3753525994cbd4107db86fc329b26dda.png](https://img-blog.csdnimg.cn/img_convert/3753525994cbd4107db86fc329b26dda.png)
ButterKnife 的基本介绍
- ButterKnife是一个使用注解对View进行注入的框架,原本如果我们要对Activity或Fragment中的View进行赋值,我们基本都是通过findViewById进行赋值,所以导致代码中会有很大一部分代码是赋值代码,不仅阅读起来疲倦,而且也很浪费开发时间。用ButterKnife则可以很轻松的省去这些步骤。最重要的一点,使用ButterKnife对性能基本没有损失,因为ButterKnife用到的注解并不是在运行时反射的,而是在编译的时候生成新的class。项目集成起来也是特别方便,使用起来也是特别简单。
- Butterknife强大的View绑定和Click事件处理功能,简化代码,提升开发效率。可以方便的处理Adapter里的ViewHolder绑定。运行时不会影响APP效率,使用配置方便。代码清晰,可读性强。
ButterKnife 的使用
1.项目中引入ButterKnife,10.2.1为ButterKnife的版本号
implementation 'com.jakewharton:butterknife:10.2.1'annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.1'
2.在Activity中增加绑定的代码
acitivity_main.xml
<?xml version="1.0" encoding="utf-8"?>
MainActivity.java
public class MainActivity extends AppCompatActivity { @BindView(R.id.tv_text) TextView mTvText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); mTvText.setText("ButterKnife绑定成功"); }}
PS :如果编译运行报以下错误
Static interface methods are only supported starting with Android N (--min-api 24): void butterknife.Unbinder.lambda$static$0()Stack trace:com.android.tools.r8.a: Static interface methods are only supported starting with Android N (--min-api 24): void butterknife.Unbinder.lambda$static$0()at com.android.tools.r8.dex.r.a(:47)at com.android.tools.r8.dex.r.b(:4)at com.android.tools.r8.dex.b.a(:63)at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:125)at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:69)at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:78)at com.google.common.util.concurrent.MoreExecutors$DirectExecutorService.execute(MoreExecutors.java:322)at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)at com.google.common.util.concurrent.AbstractListeningExecutorService.submit(AbstractListeningExecutorService.java:66)at com.google.common.util.concurrent.AbstractListeningExecutorService.submit(AbstractListeningExecutorService.java:36)...
则需要在build.gradle中增加以下代码
android { compileSdkVersion 29 ... //增加以下代码,为项目提供Java 1.8的支持 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } ...}
运行效果图
![5aed90285b461ef6b5173f86eb2270c4.png](https://img-blog.csdnimg.cn/img_convert/5aed90285b461ef6b5173f86eb2270c4.png)
对于MainActivity,编译后的效果是这样的
public void bind(MainActivity activity) { activity.mTvText = (android.widget.TextView) activity.findViewById(2130968578);}
其实ButterKnife,主要就是在编译当中,把缺少的findViewById代码补充完整,所以实现的原理是一样的。
ButterKnife不仅可以对View进行绑定,也可以对资源进行绑定
例如字符串资源,图片资源,颜色等
class ExampleActivity extends Activity { @BindString(R.string.title) String title; @BindDrawable(R.drawable.graphic) Drawable graphic; @BindColor(R.color.red) int red; // int or ColorStateList field @BindDimen(R.dimen.spacer) float spacer; // int (for pixel size) or float (for exact value) field // ...}
Adapter的绑定
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); } }}
多个View进行绑定操作
@BindViews({ R.id.first_name, R.id.middle_name, R.id.last_name })List nameViews;
点击事件的监听绑定
@OnClick(R.id.submit)public void submit(View view) { // TODO submit data to server...}