一.配置
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);
好了,本篇文章就這樣啦,存在總結不到位的地方還望指導,感謝^_^