原文鏈接:[原文鏈接:http://blog.csdn.net/donkor_/article/details/77879630]
前言:
ButterKnife是一個專注于Android系統(tǒng)的View注入框架,以前總是要寫很多findViewById來找到View對象,有了ButterKnife可以很輕松的省去這些步驟。是大神JakeWharton的力作,目前使用很廣。最重要的一點,使用ButterKnife對性能基本沒有損失,因為ButterKnife用到的注解并不是在運行時反射的,而是在編譯的時候生成新的class。項目集成起來也是特別方便,使用起來也是特別簡單。
使用:
依賴
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
配置
//頂部
apply plugin: 'com.jakewharton.butterknife'
dependencies {
implementation 'com.jakewharton:butterknife:10.0.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.0.0'
}
ButterKnife的注冊與綁定
ButterKnife使用心得與注意事項:
1、在Activity 類中綁定 :ButterKnife.bind(this);必須在setContentView();之后綁定;且父類bind綁定后,子類不需要再bind。
2、在非Activity 類(eg:Fragment、ViewHold)中綁定: ButterKnife.bind(this,view);這里的this不能替換成getActivity()。
3、在Activity中不需要做解綁操作,在Fragment 中必須在onDestroyView()中做解綁操作。
4、使用ButterKnife修飾的方法和控件,不能用private or static 修飾,否則會報錯。錯誤: @BindView fields must not be private or static. (com.zyj.wifi.ButterknifeActivity.button1)
5、setContentView()不能通過注解實現(xiàn)。(其他的有些注解框架可以)
6、使用Activity為根視圖綁定任意對象時,如果你使用類似MVC的設(shè)計模式你可以在Activity 調(diào)用ButterKnife.bind(this, activity),來綁定Controller。
7、使用ButterKnife.bind(this,view)綁定一個view的子節(jié)點字段。如果你在子View的布局里或者自定義view的構(gòu)造方法里 使用了inflate,你可以立刻調(diào)用此方法?;蛘?,從XML inflate來的自定義view類型可以在onFinishInflate回調(diào)方法中使用它。
在Activity中綁定ButterKnife:
由于每次都要在Activity中的onCreate綁定Activity,所以個人建議寫一個BaseActivity完成綁定,子類繼承即可。綁定Activity 必須在setContentView之后。使用ButterKnife.bind(this)進行綁定。代碼如下:
public class MainActivity extends AppCompatActivity {
@BindView(R.id.edit)
EditText editText;
@BindView(R.id.click)
Button click;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);// 綁定
}
@OnClick(R.id.click)
public void onClick(){
Log.e("zll", "onClick: +DKJAHSLJDHAOJKHBSDKJASHJK");
editText.setText("d,ajsgdoiuahsjildknbskajhdiua");
}
}
在Fragment中綁定ButterKnife:
Fragment的生命周期不同于activity。在onCreateView中綁定一個Fragment時,在onDestroyView中將視圖設(shè)置為null。當(dāng)你調(diào)用bind來為你綁定一個Fragment時,Butter Knife會返回一個Unbinder的實例。在適當(dāng)?shù)纳芷冢╫nDestroyView)回調(diào)中調(diào)用它的unbind方法進行Fragment解綁。使用ButterKnife.bind(this, view)進行綁定。代碼如下:
private Unbinder unbinder;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, container, false);
//返回一個Unbinder值(進行解綁),注意這里的this不能使用getActivity()
unbinder = ButterKnife.bind(this, view);
return view;
}
/**
* onDestroyView中進行解綁操作
*/
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
}
在Adapter中綁定ButterKnife:
在Adapter的ViewHolder中使用,將ViewHolder加一個構(gòu)造方法,在new ViewHolder的時候把view傳遞進去。使用ButterKnife.bind(this, view)進行綁定,代碼如下:
public class MyAdapter extends BaseAdapter {
@Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder;
if (view != ) {
holder = (ViewHolder) view.getTag();
} else {
view = inflater.inflate(R.layout.testlayout, parent, false);
holder = new ViewHolder(view);
view.setTag(holder);
}
holder.name.setText("Donkor");
holder.job.setText("Android");
// etc...
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);
}
}
}
布局內(nèi)多個控件id 注解: @BindViews()
public class MainActivity extends AppCompatActivity {
@BindViews({ R2.id.button1, R2.id.button2, R2.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 ");
}
}
綁定string里面array數(shù)組:@BindArray()
<resources>
<string name="app_name">城市</string>
<string-array name="city">
<item>北京市</item>
<item>天津市</item>
<item>哈爾濱市</item>
<item>大連市</item>
<item>香港市</item>
</string-array>
</resources>
------------------------------------------------------------------------------
public class MainActivity extends AppCompatActivity {
@BindView(R2.id.button) //綁定button 控件
public Button button ;
@BindString(R2.string.app_name) //綁定資源文件中string字符串
String str;
@BindArray(R2.array.city) //綁定string里面array數(shù)組
String [] citys ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//綁定activity
ButterKnife.bind( this ) ;
button.setText(citys[0]);
}
}
綁定Bitmap 資源:@BindBitmap( )
public class MainActivity extends AppCompatActivity {
@BindView( R2.id.imageView ) //綁定ImageView 控件
public ImageView imageView ;
@BindBitmap( R2.mipmap.bm)//綁定Bitmap 資源
public Bitmap bitmap ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//綁定activity
ButterKnife.bind( this ) ;
imageView.setImageBitmap(bitmap);
}
}
事件綁定:
綁定點擊事件:
綁定控件點擊事件:@OnClick( )
綁定控件長按事件:@OnLongClick( )
public class MainActivity extends AppCompatActivity {
@OnClick(R2.id.button1 ) //給 button1 設(shè)置一個點擊事件
public void showToast(){
Toast.makeText(this, "is a click", Toast.LENGTH_SHORT).show();
}
@OnLongClick( R2.id.button1 ) //給 button1 設(shè)置一個長按事件
public boolean showToast2(){
Toast.makeText(this, "is a long click", Toast.LENGTH_SHORT).show();
return true ;
}
@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:當(dāng)涉及綁定多個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 ) ;
}
}
更多綁定注解:
@BindView—->綁定一個view;id為一個view 變量
@BindViews —-> 綁定多個view;id為一個view的list變
@BindArray—-> 綁定string里面array數(shù)組;@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等這些有點擊的控件事件的,需要設(shè)置這些控件屬性focusable為false)
@OnItemLongClick item—->長按(返回真可以攔截onItemClick)
@OnItemSelected —->item被選擇事件
@OnLongClick —->長按事件
@OnPageChange —->頁面改變事件
@OnTextChanged —->EditText里面的文本變化事件
@OnTouch —->觸摸事件
@Optional —->選擇性注入,如果當(dāng)前對象不存在,就會拋出一個異常,為了壓制這個異常,可以在變量或者方法上加入一下注解,讓注入變成選擇性的,如果目標(biāo)View存在,則注入, 不存在,則什么事情都不做
多選
//Test @Optional
@Optional
@OnCheckedChanged(R.id.cb_test)
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked){
if(isChecked){
tvTest.setText("被選中...");
}else{
tvTest.setText("被取消...");
}
}