ButterKnife:View注入框架
1、ButterKnife介绍
ButterKnife是注解中相对简单易懂的很不错的开源框架.
1.1、ButterKnife优势
使用ButterKnife可以提升我们的开发效率,不需要写很多findViewById()方法来找到View对象。
- Eliminate findViewById calls by using @BindView on fields.
- Group multiple views in a list or array. Operate on all of them at once with actions, setters, or properties.
- Eliminate anonymous inner-classes for listeners by annotating methods with @OnClick and others.
- Eliminate resource lookups by using resource annotations on fields.
GitHub地址:https://github.com/JakeWharton/butterknife
1.2、准备ButterKnife
在项目的build.gradle添加ButterKnife的依赖
dependencies {
implementation 'com.jakewharton:butterknife:10.2.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.1'
...
}2、使用ButterKnife
2.1、ButterKnife初始化变量
以前初始化控件都是从布局文件通过findViewById()方法,将布局中控件与变量进行绑定。
mImageView = findViewById(R.id.image);代码显得比较臃肿、重复。通过ButterKnife注解,大大减少这部分的编码量,同时代码逻辑清晰,不会降低APP效率。
@BindView(R.id.image)
ImageView mImageView;诸如strings.xml中的字符串等资源,也可通过ButterKnife注解初始化:
@BindString(R.string.app_name)
String mAppName;需要在onCreate()方法中,setContentView(int layoutResID)方法调用之后,进行ButterKnife绑定初始化:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base_glide);
ButterKnife.bind(this);
}2.2、ButterKnife设置监听器
以前View的点击都需要设置诸如setOnClickListener(),监听点击事件。通过ButterKnife可以直接:
@OnClick(R.id.image)
public void onViewClicked() {
//点击事件
}如果有多个控件需要点击处理呢?可以复用,通过switch判断不同的View点击事件。
@OnClick({R.id.image, R.id.text_view})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.image:
break;
case R.id.text_view:
break;
}
}2.3、注意
①成员变量定义成private或者static编译会报错。所以,还是默认的访问权限吧。
@BindView fields must not be private or static.
②Butterknife插件用到了Lambda语法,需要指定Java 8及以上的JDK编译选项,参考AndroidStudio中使用Java8。否则报错:
Process: com.example.myapplication, PID: 13034
java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; in class Ljava/lang/invoke/LambdaMetafactory; or its super classes (declaration of 'java.lang.invoke.LambdaMetafactory' appears in /apex/com.android.runtime/javalib/core-oj.jar)
at butterknife.internal.DebouncingOnClickListener.<clinit>(DebouncingOnClickListener.java:12)
3、ButterKnife插件
还有更加高效的方式,在AndroidStudio Plugins中搜索安装ButterKnife插件

在Activity代码中,鼠标放到setContentView(@LayoutRes int layoutResID)中的R.layout.xxx上,按Alt+Insert键,弹出菜单,选择Generate Butterknife Injections选项。
会出现在布局文件中定义的控件,前提是这些控件都有id,才能被ButterKnife识别。

相关博客:
Stack Overflow > Error using Retrofit Builder in Android app: java.lang.NoSuchMethodError

