首語
- 在android開發過程中,我們會寫大量的佈局和點擊事件,像findViewById、設置view監聽這樣簡單而重複的操作讓人覺得麻煩,而ButterKnife是註解中相對簡單易懂的很不錯的開源框架。
優勢
- 強大的View綁定和Click事件處理功能,簡化代碼,提升開發效率。
- 方便的處理Adapter裏的ViewHolder綁定問題。
- 運行時不會影響APP效率,使用配置方便。
- 代碼清晰,可讀性強。
GitHub地址:https://github.com/JakeWharton/butterknife
ButterKnife基本使用
使用步驟
1.在Setting->Plugins中輸入butterknife——>添加插件Android ButterKnife Aelezny ——>點擊安裝。
2.dependencies中添加依賴:
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor "com.jakewharton:butterknife-compiler:8.8.1"
ButterKnife使用心得
- 在Activity類中綁定,ButterKnife.bind(this);必須在setContentView();之後綁定;且父類bind綁定後,子類不需要再bind。
- 在非Activity 類(eg:Fragment、ViewHold)中綁定: ButterKnife.bind(this,view);這裏的this不能替換成getActivity()。
- 在Activity中不需要做解綁操作,在Fragment 中必須在onDestroyView()中做解綁操作。
- 使用ButterKnife修飾的方法和控件,不能用private or static 修飾,否則會報錯。
錯誤:@BindView fields must not be private or static. (com.zyj.wifi.ButterknifeActivity.button1)
。 - setContentView()不能通過註解實現。(其他的有些註解框架可以)
- 使用Activity爲根視圖綁定任意對象時,如果你使用類似MVC的設計模式你可以在Activity 調用ButterKnife.bind(this, activity),來綁定Controller。
- 使用ButterKnife.bind(this,view)綁定一個view的子節點字段。如果你在子View的佈局裏或者自定義view的構造方法裏 使用了inflate,你可以立刻調用此方法。或者,從XML inflate來的自定義view類型可以在onFinishInflate回調方法中使用它。
在Activity中綁定ButterKnife
public class ButterKnifeActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_butter_knife);
//在Activity中綁定ButterKnife
ButterKnife.bind(this);
}
}
在Fragment中綁定ButterKnife
public class ButterKnifeFragment extends Fragment {
private Unbinder unbinder;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_butter_knife, container, false);
//在Fragment中進行綁定ButterKnife,返回一個Unbinder(進行解綁),這裏的this不能用Activity
unbinder = ButterKnife.bind(this, view);
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
//在onDestroyView中進行解綁操作
unbinder.unbind();
}
}
在Adapter中綁定ButterKnife
public class ButterKnifeAdapter extends BaseAdapter {
@Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder;
if (view != null) {
holder = (ViewHolder) view.getTag();
} else {
view = view.inflate(R.layout.testlayout, parent, false);
holder = new ViewHolder(view);
view.setTag(holder);
}
holder.name.setText("ButterKnife");
holder.job.setText("Android");
return view;
}
static class ViewHolder {
@BindView(R.id.title)
TextView name;
@BindView(R.id.job)
TextView job;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
}
View綁定
- 控件id註解
@BindView(R.id.fragment_answer_et1)
EditText et1;
@BindView(R.id.fragment_answer_et2)
EditText et2;
@BindView(R.id.fragment_answer_et3)
EditText et3;
- 多個控件id註解
public class MainActivity extends AppCompatActivity {
@BindViews({ R.id.button1, R.id.button2, R.id.button3})
public List<Button> buttonList ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
buttonList.get( 0 ).setText( "hello 1 ");
buttonList.get( 1 ).setText( "hello 2 ");
buttonList.get( 2 ).setText( "hello 3 ");
}
}
事件綁定
- 控件點擊事件
public class MainActivity extends AppCompatActivity {
@OnClick(R.id.button1 ) //給 button1 設置一個點擊事件
public void showToast(){
Toast.makeText(this, "is a click", Toast.LENGTH_SHORT).show();
}
@OnLongClick( R.id.button1 ) //給 button1 設置一個長按事件
public boolean showToast2(){
Toast.makeText(this, "is a long click", Toast.LENGTH_SHORT).show();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//綁定activity
ButterKnife.bind( this ) ;
}
}
- 多個id綁定事件
public class MainActivity extends AppCompatActivity {
//Tip:當涉及綁定多個id事件時,我們可以使用Android studio的Butterknife
//插件zelezny快速自動生成
@OnClick({R.id.ll_product_name, R.id.ll_product_lilv, R.id.ll_product_qixian, R.id.ll_product_repayment_methods})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.ll_product_name:
System.out.print("我是點擊事件1");
break;
case R.id.ll_product_lilv:
System.out.print("我是點擊事件2");
break;
case R.id.ll_product_qixian:
System.out.print("我是點擊事件3");
break;
case R.id.ll_product_repayment_methods:
System.out.print("我是點擊事件4");
break;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//綁定activity
ButterKnife.bind( this ) ;
- 省略setOnClickListener()
@OnClick(R.id.basic_finish_a_button)
void finishA(View view) {
finish();
}//方法不能被private或public修飾,並且有一個參數
ButterKnife.inject(this);
- ListView的點擊@OnItemClick, CheckBox的@OnCheckedChanged也可以實現省略操作。
更多綁定註解
- @BindView—->綁定一個view;id爲一個view 變量
- @BindViews —-> 綁定多個view;id爲一個view的list變量
- @BindArray—-> 綁定string裏面array數組;@BindArray(R.array.city ) String[] citys ;
- @BindBitmap—->綁定圖片資源爲Bitmap;@BindBitmap( R.mipmap.wifi ) Bitmap bitmap;
- @BindBool —->綁定boolean值
- @BindColor —->綁定color;@BindColor(R.color.colorAccent) int black;
- @BindDimen —->綁定Dimen;@BindDimen(R.dimen.borth_width) int mBorderWidth;
- @BindDrawable —-> 綁定Drawable;@BindDrawable(R.drawable.test_pic) Drawable mTestPic;
- @BindFloat —->綁定float
- @BindInt —->綁定int
- @BindString —->綁定一個String id爲一個String變量;@BindString( R.string.app_name ) String meg;
更多事件註解
- @OnClick—->點擊事件
- @OnCheckedChanged —->選中,取消選中
- @OnEditorAction —->軟鍵盤的功能鍵
- @OnFocusChange —->焦點改變
- @OnItemClick item—->被點擊(注意這裏有坑,如果item裏面有Button等這些有點擊的控件事件的,需要設置這些控件屬性focusable爲false)
- @OnItemLongClick item—->長按(返回真可以攔截onItemClick)
- @OnItemSelected —->item被選擇事件
- @OnLongClick —->長按事件
- @OnPageChange —->頁面改變事件
- @OnTextChanged —->EditText裏面的文本變化事件
- @OnTouch —->觸摸事件
- @Optional —->選擇性注入,如果當前對象不存在,就會拋出一個異常,爲了壓制這個異常,可以在變量或者方法上加入一下註解,讓注入變成選擇性的,如果目標View存在,則注入, 不存在,則什麼事情都不做。