1.Gradle 配置
implementation 'com.jakewharton:butterknife:10.1.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
Java8才支持静态接口方法的原因,可以通过在app的build.gradle文件中配置使用Java8的编译
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
2.绑定
- Activity 中使用,一定要在
setContentView()
之后再写ButterKnife.bind(this);
- Fragment 中使用
View view= (ViewGroup) LayoutInflater.from(getActivity()).inflate(R.layout.test, null);
ButterKnife.bind(this, view);
- 自定义view中,与fragment相似
View view= LayoutInflater.from(getContext()).inflate(R.layout.test, this);
ButterKnife.bind(this,view);
3.报错,备注解的属性和方法不能为私有的和静态的
@BindView(R.id.ivBookCover)
ImageView mIvBookCover;
@BindView(R.id.tvBookListTitle)
TextView mTvBookTitle;
4.解绑
public class BaseFragment extends Fragment {
public static final String TAG = "BaseFragment";
protected Unbinder mUnbinder;
@Override
public void onDestroyView() {
if (this.mUnbinder != null) {
this.mUnbinder.unbind();
}
super.onDestroyView();
}
}
5.特别注意
在异步请求中,尤其是网络请求,一般异步回来网络结果时,我们需要更新UI,这个时候,如果界面已经调用了onDestroy()或者onDestroyView(),相当于页面已经销毁,调用了unbind()方法了,如果我们还有更新UI的话,就会报空指针异常。所以必须在异步回调里,来判断是否已经解绑,如果已经调用解绑了,那就不能再执行相关操作了。
方法是在unbind()之后将mUnbinder=null;
在异步回调时,首先判断mUnbinder==null,则return;
书到用时方恨少,纸上得来终觉浅。共勉。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/114991.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...