一.配置
dependencies {
implementation 'com.jakewharton:butterknife:8.2.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.2.1'
}
二.注意事项
1.在Activity中绑定,必须在setContentView()之后绑定,且父类绑定后,子类不需要再绑定。
2.在Fragment,ViewHold中绑定 ButterKnife.bind(this,view);这里的this不能替换成getActivity()。
3.在Fragment中必须在onDestroyView()中做解绑操作。
4.使用ButterKnife修饰的方法和控件,不能用private or static 修饰,否则会报错。
5.setContentView()不能通过注解实现。(其他的有些注解框架可以)。
6.在异步请求中,我们常常会更新UI,这个时候如果页面销毁了,ButterKnife也解绑了,那么就会报空指针异常, 所以必须在异步回调里来判断是否已经解绑;方法是在unbind()之后将mUnbinder=null 在异步回调时,首先判断mUnbinder是否为null
三.使用方法
1.Activity中使用
public abstract class BaseActivity extends AppCompatActivity {
protected BaseActivity mActivity;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mActivity = this;
if (getSupportActionBar() != null) {
getSupportActionBar().hide();
}
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
initLayout();
ButterKnife.bind(mActivity);
initData();
initView();
}
protected abstract void initLayout();
protected abstract void initData();
protected abstract void initView();
}
PS:由于每次都要在Activity中的onCreate绑定,所以个人建议写一个基类完成绑定,子类继承即可
2.Fragment中使用
public class MineFragment extends BaseFragment {
private Unbinder unbinder;
@Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
View view = Utils.getInflater().inflate(R.layout.fragment_mine, null);
unbinder=ButterKnife.bind(this, view);
return view;
}
@Override public void onDestroyView() {
if (unbinder != null) {
unbinder.unbind();
unbinder = null;
}
super.onDestroyView();
}
}
3.ViewHolder中使用
public static class ViewHolder {
@BindView(R.id.item_head_gallery_img)
ImageView mHeadGalleryIv;
ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
4.监听器绑定
@OnClick(R.id.submit)
public void login() {
// TODO
}
//定义一个特定类型,它将自动转换
@OnClick(R.id.submit)
public void sayHello(Button button) {
button.setText("Hello!");
}
//多个View共用同一事件
@OnClick({R.id.profile_image, R.id.tv_user_phone})
public void login() {
// TODO
}
//自定义View可以绑定自己的监听,不指定ID
public class FancyButton extends Button {
@OnClick
public void onClick() {
// TODO
}
}
5.可以绑定一组View到一个List里
@BindViews({R.id.tv_feed_complex,R.id.tv_feed_fault,R.id.tv_feed_other})
List<TextView> feedViews;
6.资源绑定
@BindColor(R.color.selected)
int selected;
@BindString(R.string.app_name)
String appName;
@BindDrawable(R.drawable.wel1)
Drawable welcomel;
@BindArray(R.array.city)
String[] citys;
PS:资源文件R.array.city
<resources>
<string-array name="city">
<item>北京</item>
<item>上海</item>
</string-array>
</resources>
7.可选绑定:
默认情况下,@bind和监听器绑定都必须有一个目标view,当ButterKnife找不到对应的view时会抛出一个异常。为了防止这种异常情况的发生,可以在绑定的字段前面使用@Nullable注解,在绑定的方法前面则可使用@Option注解,来表明对应的是一个可选绑定。
@Nullable
@BindView(R.id.iv_home)
ImageView mHomeIv;
@Optional
@OnClick(R.id.ll_mine)
public void mine() {
//TODO
}
8.其他
ButterKnife也提供了一个findById方法
TextView goWx = ButterKnife.findById(view,R.id.tv_goWX);
好了,本篇文章就这样啦,存在总结不到位的地方还望指导,感谢^_^