自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android Butterknife(黃油刀) 使用方法總結(jié)

移動開發(fā) Android
ButterKnife是一個專注于Android系統(tǒng)的View注入框架,以前總是要寫很多findViewById來找到View對象,有了ButterKnife可以很輕松的省去這些步驟。是大神JakeWharton的力作,目前使用很廣。

前言:

ButterKnife是一個專注于Android系統(tǒng)的View注入框架,以前總是要寫很多findViewById來找到View對象,有了ButterKnife可以很輕松的省去這些步驟。是大神JakeWharton的力作,目前使用很廣。最重要的一點(diǎn),使用ButterKnife對性能基本沒有損失,因?yàn)锽utterKnife用到的注解并不是在運(yùn)行時反射的,而是在編譯的時候生成新的class。項(xiàng)目集成起來也是特別方便,使用起來也是特別簡單。

通過學(xué)習(xí)本文,學(xué)會如何在項(xiàng)目中使用ButterKnife。本文包含以下要點(diǎn):

前言

  1. 簡單介紹
  2. ButterKnife的優(yōu)勢
  3. 基本配置
  4. ButterKnife的注冊與綁定
  5. ButterKnife使用心得與注意事項(xiàng)
  6. 在Activity中綁定ButterKnife
  7. 在Fragment中綁定ButterKnife
  8. 在Adapter中綁定ButterKnife
  9. ButterKnife的基本使用
  10. 綁定View
  11. 綁定資源
  12. 事件綁定
  13. 綁定監(jiān)聽
  14. 使用findById
  15. 設(shè)置多個view的屬性
  16. 使用注意事項(xiàng)
  17. 更多綁定注解
  18. 更多事件注解
  19. ButterKnife的代碼混淆
  20. Butterknife插件:zelezny
  21. 插件安裝
  22. 插件使用

ButterKnife項(xiàng)目地址:https://github.com/JakeWharton/butterknife

▲ ButterKnife的優(yōu)勢:

  1. 強(qiáng)大的View綁定和Click事件處理功能,簡化代碼,提升開發(fā)效率
  2. 方便的處理Adapter里的ViewHolder綁定問題
  3. 運(yùn)行時不會影響APP效率,使用配置方便
  4. 代碼清晰,可讀性強(qiáng)

基本配置

在android Studio項(xiàng)目中配置使用ButterKnife

Step one:在Project的 build.gradle 中添加如下代碼:

  1. buildscript { 
  2.     repositories { 
  3.         jcenter() 
  4.     } 
  5.     dependencies { 
  6.         classpath 'com.android.tools.build:gradle:2.3.3' 
  7.         classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'  //添加這一行 
  8.     } 

Step two:在App的 build.gradle 中添加如下代碼:

  1. apply plugin: 'com.jakewharton.butterknife' 

dependencies中添加:

  1. compile 'com.jakewharton:butterknife:8.8.1' 
  2. annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' 

構(gòu)建環(huán)境特別簡單,接下來看看如何使用

ButterKnife的注冊與綁定

▲ ButterKnife使用心得與注意事項(xiàng):

  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()不能通過注解實(shí)現(xiàn)。(其他的有些注解框架可以)
  6. 使用Activity為根視圖綁定任意對象時,如果你使用類似MVC的設(shè)計(jì)模式你可以在Activity 調(diào)用ButterKnife.bind(this, activity),來綁定Controller。
  7. 使用ButterKnife.bind(this,view)綁定一個view的子節(jié)點(diǎn)字段。如果你在子View的布局里或者自定義view的構(gòu)造方法里 使用了inflate,你可以立刻調(diào)用此方法?;蛘?,從XML inflate來的自定義view類型可以在onFinishInflate回調(diào)方法中使用它。

▲ 在Activity中綁定ButterKnife:

由于每次都要在Activity中的onCreate綁定Activity,所以個人建議寫一個BaseActivity完成綁定,子類繼承即可。綁定Activity 必須在setContentView之后。使用ButterKnife.bind(this)進(jìn)行綁定。代碼如下:

  1. public class MainActivity extends AppCompatActivity{   
  2.     @Override   
  3.     protected void onCreate(Bundle savedInstanceState) {   
  4.         super.onCreate(savedInstanceState);   
  5.         setContentView(R.layout.activity_main);   
  6.         //綁定初始化ButterKnife   
  7.         ButterKnife.bind(this);   
  8.     }   
  9. }   

▲ 在Fragment中綁定ButterKnife:

Fragment的生命周期不同于activity。在onCreateView中綁定一個Fragment時,在onDestroyView中將視圖設(shè)置為null。當(dāng)你調(diào)用bind來為你綁定一個Fragment時,Butter Knife會返回一個Unbinder的實(shí)例。在適當(dāng)?shù)纳芷?onDestroyView)回調(diào)中調(diào)用它的unbind方法進(jìn)行Fragment解綁。使用ButterKnife.bind(this, view)進(jìn)行綁定。代碼如下:

  1. public class ButterknifeFragment extends Fragment{   
  2.     private Unbinder unbinder;   
  3.     @Override   
  4.     public View onCreateView(LayoutInflater inflater, ViewGroup container,   
  5.                              Bundle savedInstanceState) {   
  6.         View view = inflater.inflate(R.layout.fragment, container, false);   
  7.         //返回一個Unbinder值(進(jìn)行解綁),注意這里的this不能使用getActivity()   
  8.         unbinder = ButterKnife.bind(this, view);   
  9.         return view;   
  10.     }   
  11.  
  12.     /**  
  13.      * onDestroyView中進(jìn)行解綁操作  
  14.      */   
  15.     @Override   
  16.     public void onDestroyView() {   
  17.         super.onDestroyView();   
  18.         unbinder.unbind();   
  19.     }   
  20. }  

▲ 在Adapter中綁定ButterKnife:

在Adapter的ViewHolder中使用,將ViewHolder加一個構(gòu)造方法,在new ViewHolder的時候把view傳遞進(jìn)去。使用ButterKnife.bind(this, view)進(jìn)行綁定,代碼如下:

  1. public class MyAdapter extends BaseAdapter {   
  2.  
  3.   @Override    
  4.   public View getView(int position, View view, ViewGroup parent) {   
  5.     ViewHolder holder;   
  6.     if (view != null) {   
  7.       holder = (ViewHolder) view.getTag();   
  8.     } else {   
  9.       view = inflater.inflate(R.layout.testlayout, parent, false);   
  10.       holder = new ViewHolder(view);   
  11.       view.setTag(holder);   
  12.     }   
  13.  
  14.     holder.name.setText("Donkor");   
  15.     holder.job.setText("Android"); 
  16.     // etc...   
  17.     return view;   
  18.   }   
  19.  
  20.   static class ViewHolder {   
  21.     @BindView(R.id.title) TextView name;   
  22.     @BindView(R.id.job) TextView job;   
  23.  
  24.     public ViewHolder(View view) {   
  25.       ButterKnife.bind(this, view);   
  26.     }   
  27.   }   
  28. }  

ButterKnife的基本使用

▲ 綁定View:

控件id 注解: @BindView()

  1. @BindView( R2.id.button)   
  2. public Button button;  

布局內(nèi)多個控件id 注解: @BindViews()

  1. public class MainActivity extends AppCompatActivity {   
  2.  
  3.     @BindViews({ R2.id.button1, R2.id.button2,  R2.id.button3})   
  4.     public List<Button> buttonList ;   
  5.  
  6.     @Override   
  7.     protected void onCreate(Bundle savedInstanceState) {   
  8.         super.onCreate(savedInstanceState);   
  9.         setContentView(R.layout.activity_main);   
  10.  
  11.         ButterKnife.bind(this);   
  12.  
  13.         buttonList.get( 0 ).setText( "hello 1 ");   
  14.         buttonList.get( 1 ).setText( "hello 2 ");   
  15.         buttonList.get( 2 ).setText( "hello 3 ");   
  16.     }   
  17. }   

▲ 綁定資源:

綁定string 字符串:@BindString()

  1. public class MainActivity extends AppCompatActivity {   
  2.  
  3.     @BindView(R2.id.button) //綁定button 控件   
  4.     public Button button ;   
  5.  
  6.     @BindString(R2.string.app_name)  //綁定資源文件中string字符串   
  7.     String str;   
  8.  
  9.     @Override   
  10.     protected void onCreate(Bundle savedInstanceState) {   
  11.         super.onCreate(savedInstanceState);   
  12.         setContentView(R.layout.activity_main);   
  13.         //綁定activity   
  14.         ButterKnife.bind( this ) ;   
  15.         button.setText( str );   
  16.     }   

綁定string里面array數(shù)組:@BindArray()

  1. <resources>   
  2.     <string name="app_name">城市</string>   
  3.  
  4.     <string-array name="city">   
  5.         <item>北京市</item>   
  6.         <item>天津市</item>   
  7.         <item>哈爾濱市</item>   
  8.         <item>大連市</item>   
  9.         <item>香港市</item>   
  10.     </string-array>   
  11.  
  12. </resources>   
  13.  
  14. ------------------------------------------------------------------------------ 
  15.  
  16. public class MainActivity  extends AppCompatActivity {   
  17.  
  18.     @BindView(R2.id.button) //綁定button 控件   
  19.     public Button button ;   
  20.  
  21.     @BindString(R2.string.app_name)  //綁定資源文件中string字符串   
  22.     String str;   
  23.  
  24.     @BindArray(R2.array.city)  //綁定string里面array數(shù)組   
  25.     String [] citys ;   
  26.  
  27.     @Override   
  28.     protected void onCreate(Bundle savedInstanceState) {   
  29.         super.onCreate(savedInstanceState);   
  30.         setContentView(R.layout.activity_main);   
  31.         //綁定activity   
  32.         ButterKnife.bind( this ) ;   
  33.         button.setText(citys[0]);   
  34.     }   
  35. }   

綁定Bitmap 資源:@BindBitmap()

  1. public class MainActivity extends AppCompatActivity {   
  2.  
  3.     @BindView( R2.id.imageView ) //綁定ImageView 控件   
  4.     public ImageView imageView ;   
  5.  
  6.     @BindBitmap( R2.mipmap.bm)//綁定Bitmap 資源   
  7.     public Bitmap bitmap ;   
  8.  
  9.     @Override   
  10.     protected void onCreate(Bundle savedInstanceState) {   
  11.         super.onCreate(savedInstanceState);   
  12.         setContentView(R.layout.activity_main);   
  13.  
  14.         //綁定activity   
  15.         ButterKnife.bind( this ) ;   
  16.  
  17.         imageView.setImageBitmap(bitmap);   
  18.     }   
  19.  
  20. }   

綁定一個顏色值:@BindColor()

  1. public class MainActivity extends AppCompatActivity {   
  2.  
  3.     @BindView( R2.id.button)  //綁定一個控件   
  4.     public Button button;   
  5.  
  6.     @BindColor( R2.color.colorAccent ) //具體色值在color文件中   
  7.     int black ;  //綁定一個顏色值   
  8.  
  9.     @Override   
  10.     protected void onCreate(Bundle savedInstanceState) {   
  11.         super.onCreate(savedInstanceState);   
  12.         setContentView(R.layout.activity_main);   
  13.  
  14.         //綁定activity   
  15.         ButterKnife.bind( this ) ;   
  16.  
  17.         button.setTextColor(  black );   
  18.     }   
  19. }   

▲ 事件綁定:

綁定點(diǎn)擊事件:

  • 綁定控件點(diǎn)擊事件:@OnClick( )
  • 綁定控件長按事件:@OnLongClick( )
  1. public class MainActivity extends AppCompatActivity {   
  2.  
  3.     @OnClick(R2.id.button1 )   //給 button1 設(shè)置一個點(diǎn)擊事件   
  4.     public void showToast(){   
  5.         Toast.makeText(this, "is a click", Toast.LENGTH_SHORT).show();   
  6.     }   
  7.  
  8.     @OnLongClick( R2.id.button1 )    //給 button1 設(shè)置一個長按事件   
  9.     public boolean showToast2(){   
  10.         Toast.makeText(this, "is a long click", Toast.LENGTH_SHORT).show();   
  11.         return true ;   
  12.     }   
  13.  
  14.     @Override   
  15.     protected void onCreate(Bundle savedInstanceState) {   
  16.         super.onCreate(savedInstanceState);   
  17.         setContentView(R.layout.activity_main);   
  18.  
  19.         //綁定activity   
  20.         ButterKnife.bind( this ) ;   
  21.     }   
  22. }   

指定多個id綁定事件:

  1. public class MainActivity extends AppCompatActivity {   
  2.  
  3.     //Tip:當(dāng)涉及綁定多個id事件時,我們可以使用Android studio的Butterknife 
  4.     //插件zelezny快速自動生成的,之后在下面會有介紹安裝插件與使用   
  5.     @OnClick({R.id.ll_product_name, R.id.ll_product_lilv, R.id.ll_product_qixian, R.id.ll_product_repayment_methods})   
  6.     public void onViewClicked(View view) {   
  7.         switch (view.getId()) {   
  8.             case R.id.ll_product_name:   
  9.                 System.out.print("我是點(diǎn)擊事件1");   
  10.                 break;   
  11.             case R.id.ll_product_lilv:   
  12.                 System.out.print("我是點(diǎn)擊事件2");   
  13.                 break;   
  14.             case R.id.ll_product_qixian:   
  15.                 System.out.print("我是點(diǎn)擊事件3");   
  16.  
  17.                 break;   
  18.             case R.id.ll_product_repayment_methods:   
  19.                 System.out.print("我是點(diǎn)擊事件4");   
  20.                 break;   
  21.         }   
  22.     }   
  23.  
  24.     @Override   
  25.     protected void onCreate(Bundle savedInstanceState) {   
  26.         super.onCreate(savedInstanceState);   
  27.         setContentView(R.layout.activity_main);   
  28.  
  29.         //綁定activity   
  30.         ButterKnife.bind( this ) ;   
  31.     }   

通過上面的例子可以看出多條點(diǎn)擊事件是沒有用R2的方式,如果一定要使用R2的寫法,可以單一逐次寫,正確的寫法如下:

  1. public class MainActivity extends AppCompatActivity {     
  2.  
  3.     @OnClick(R2.id.ll_product_name)     
  4.     public void onViewClicked1(View view) {     
  5.        System.out.print("我是點(diǎn)擊事件1");                
  6.     }     
  7.     @OnClick(R2.id.ll_product_lilv)     
  8.     public void onViewClicked2(View view) {     
  9.        System.out.print("我是點(diǎn)擊事件2");      
  10.     }    
  11.     @OnClick(R2.id.ll_product_qixian)     
  12.     public void onViewClicked3(View view) {     
  13.        System.out.print("我是點(diǎn)擊事件3");                
  14.     }     
  15.     @OnClick(R2.id.ll_product_repayment_methods)     
  16.     public void onViewClicked4(View view) {     
  17.        System.out.print("我是點(diǎn)擊事件4");                
  18.     }     
  19.  
  20.     @Override     
  21.     protected void onCreate(Bundle savedInstanceState) {     
  22.         super.onCreate(savedInstanceState);     
  23.         setContentView(R.layout.activity_main);     
  24.  
  25.         //綁定activity     
  26.         ButterKnife.bind( this ) ;     
  27.     }     
  28. }   

自定義View使用綁定事件

不用指定id,直接注解OnClick??创a覺得好像跟實(shí)現(xiàn)點(diǎn)擊事件的方法類似。實(shí)際上并沒有實(shí)現(xiàn)OnClickListener接口。代碼如下:

  1. public class MyButton extends Button {   
  2.   @OnClick   
  3.   public void onClick() {}   
  4. }   

▲ 綁定監(jiān)聽:

Listeners可以自動配置到方法中

  1. @OnClick(R.id.submit)   
  2. public void submit(View view) {   
  3.   // TODO submit data to server...   

對監(jiān)聽器方法的所有參數(shù)都是可選的

  1. @OnClick(R.id.submit)   
  2. public void submit() {   
  3.   // TODO submit data to server...   
  4. }  

自定義一個特定類型,它將自動被轉(zhuǎn)換

  1. @OnClick(R.id.submit)   
  2.     public void sayHi(Button button) {//看括號內(nèi)參數(shù)的變化就明白了   
  3.       button.setText("Hello!");   
  4.     }  

在單個綁定中指定多個id,用于公共事件處理。這里舉例點(diǎn)擊事件。其他的事件監(jiān)聽同樣也是可以的。

  1. @OnClick(R.id.submitCode,R.id.submitFile,R.id.submitTest)   
  2.     public void sayHi(Button button) {//多個控件對應(yīng)公共事件 
  3.       button.setText("Success!");   
  4.     }  

自定義視圖可以通過不指定ID來綁定到它們自己的監(jiān)聽器。

  1. public class FancyButton extends Button {   
  2.   @OnClick   
  3.   public void onClick() {   
  4.     // TODO do something!   
  5.   }   

Listener中多方法注解

方法注解,其對應(yīng)的監(jiān)聽器有多個回調(diào),可用于綁定到其中任何一個。每個注解都有一個它綁定的默認(rèn)回調(diào)。使用回調(diào)參數(shù)指定一個替換。以Spinner為例。

原本代碼:

  1. Spinner s=new Spinner(this);   
  2.        //原始方法:Spinner 條目選擇監(jiān)聽事件 正常寫法   
  3.        s.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){   
  4.            @Override   
  5.            public void onItemSelected(AdapterView<?> parent, View viewint position, long id) {   
  6.            }   
  7.            @Override   
  8.            public void onNothingSelected(AdapterView<?> parent) {   
  9.            }   
  10.        });  

通過 Butter Knife 注解方式

  1. public class MainActivity extends AppCompatActivity {   
  2.     /*利用注解對Spinner item  作選擇監(jiān)聽事件處理方式*/   
  3.     @OnItemSelected(R.id.my_spiner)//默認(rèn)callback為ITEM_SELECTED   
  4.     void onItemSelected(int position) {   
  5.         Toast.makeText(this, "position: " + position, Toast.LENGTH_SHORT).show();   
  6.     }   
  7.     /*  
  8.     * 注解onNothingSelected,需要在注解參數(shù)添加一個callback,  
  9.     * 注意的是Spinner中只要有數(shù)據(jù),默認(rèn)都會選中第0個數(shù)據(jù),所以想進(jìn)入到onNothingSelected()方法,就需要把Adapter中的數(shù)據(jù)都清空  
  10.     */   
  11.     @OnItemSelected(value = R.id.my_spiner, callback = OnItemSelected.Callback.NOTHING_SELECTED)   
  12.     void onNothingSelected() {   
  13.         Toast.makeText(this, "Nothing", Toast.LENGTH_SHORT).show();   
  14.     }   
  15.  
  16.     @Override   
  17.     protected void onCreate(Bundle savedInstanceState) {   
  18.         super.onCreate(savedInstanceState);   
  19.         setContentView(R.layout.activity_main);   
  20.  
  21.         //綁定activity   
  22.         ButterKnife.bind( this ) ;   
  23.         Spinner s=new Spinner(this);   
  24.     }   
  25. }   

@OnCheckedChanged監(jiān)聽的使用

原方法應(yīng)是:setOnCheckedChangeListener()。使用栗子

  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   
  3.     android:layout_width="match_parent"   
  4.     android:layout_height="match_parent"   
  5.     android:orientation="vertical">   
  6.  
  7.     <RadioGroup   
  8.         android:id="@+id/rg_main"   
  9.         android:layout_width="fill_parent"   
  10.         android:layout_height="48dp"   
  11.         android:layout_alignParentBottom="true"   
  12.         android:background="@color/white"   
  13.         android:orientation="horizontal">   
  14.  
  15.         <RadioButton   
  16.             android:id="@+id/rg_home"   
  17.             android:layout_width="match_parent"   
  18.             android:layout_height="match_parent"   
  19.             android:focusable="false"   
  20.             android:text="@string/nav_one" />   
  21.  
  22.         <RadioButton   
  23.             android:id="@+id/rg_wealth"   
  24.             android:layout_width="match_parent"   
  25.             android:layout_height="match_parent"   
  26.             android:focusable="false"   
  27.             android:text="@string/nav_two" />   
  28.  
  29.         <RadioButton   
  30.             android:id="@+id/rg_account"   
  31.             android:layout_width="match_parent"   
  32.             android:layout_height="match_parent"   
  33.             android:focusable="false"   
  34.             android:text="@string/nav_four" />   
  35.     </RadioGroup>   
  36.  
  37. </LinearLayout>   
  38.  
  39. ------------------------------------------------------------------------- 
  40.  
  41. @OnCheckedChanged({R.id.rg_home,R.id.rg_wealth,R.id.rg_account})   
  42.     public void OnCheckedChangeListener(CompoundButton view, boolean ischanged ){   
  43.         switch (view.getId()) {   
  44.             case R.id.rg_home:   
  45.                 if (ischanged){//注意:這里一定要有這個判斷,只有對應(yīng)該id的按鈕被點(diǎn)擊了,ischanged狀態(tài)發(fā)生改變,才會執(zhí)行下面的內(nèi)容   
  46.                     //這里寫你的按鈕變化狀態(tài)的UI及相關(guān)邏輯   
  47.                 }   
  48.                 break;   
  49.             case R.id.rg_wealth:   
  50.                 if (ischanged) {   
  51.                     //這里寫你的按鈕變化狀態(tài)的UI及相關(guān)邏輯   
  52.                 }   
  53.                 break;   
  54.             case R.id.rg_account:   
  55.                 if (ischanged) {   
  56.                     //這里寫你的按鈕變化狀態(tài)的UI及相關(guān)邏輯   
  57.                 }   
  58.                 break;   
  59.             default:   
  60.                 break;   
  61.         }   
  62.     }  

▲ 使用findById:

Butter Knife仍然包含了findById()方法,用于仍需從一個view ,Activity,或者Dialog上初始化view的時候,并且它可以自動轉(zhuǎn)換類型。

  1. View view = LayoutInflater.from(context).inflate(R.layout.thing, null);   
  2. TextView firstName = ButterKnife.findById(view, R.id.first_name);   
  3. TextView lastName = ButterKnife.findById(view, R.id.last_name);   
  4. ImageView iv = ButterKnife.findById(view, R.id.iv);   

▲ 設(shè)置多個view的屬性:

apply()

作用:允許您立即對列表中的所有視圖進(jìn)行操作。

Action和Setter接口

作用:Action和Setter接口允許指定簡單的行為。

  1. public class MainActivity extends AppCompatActivity {   
  2.  
  3.     @BindViews({R2.id.first_name, R2.id.middle_name, R2.id.last_name})   
  4.     List<EditText> nameViews;   
  5.  
  6.     @Override   
  7.     protected void onCreate(Bundle savedInstanceState) {   
  8.         super.onCreate(savedInstanceState);   
  9.         setContentView(R.layout.activity_main);   
  10.  
  11.         //綁定activity   
  12.         ButterKnife.bind(this);   
  13.  
  14.         //設(shè)置多個view的屬性   
  15.         //方式1:傳遞值   
  16.         ButterKnife.apply(nameViews, DISABLE);   
  17.         //方式2:指定值   
  18.         ButterKnife.apply(nameViews, ENABLED, false);   
  19.         ////方式3 設(shè)置View的Property   
  20.         ButterKnife.apply(nameViews, View.ALPHA, 0.0f);//一個Android屬性也可以用于應(yīng)用的方法。   
  21.     }   
  22.  
  23.     /*  
  24.     * Action接口設(shè)置屬性  
  25.     */   
  26.     static final ButterKnife.Action<View> DISABLE = new ButterKnife.Action<View>() {   
  27.         @Override   
  28.         public void apply(View viewint index) {   
  29.             view.setEnabled(false);//目的是使多個view都具備此屬性   
  30.         }   
  31.     };   
  32.     /*  
  33.     * Setter接口設(shè)置屬性  
  34.     */   
  35.     static final ButterKnife.Setter<View, Boolean> ENABLED = new ButterKnife.Setter<View, Boolean>() {   
  36.         @Override   
  37.         public void set(View view, Boolean value, int index) {   
  38.             view.setEnabled(value);//目的是使多個view都具備此屬性,可變boolean值是可以傳遞的   
  39.         }   
  40.     };   
  41. }  

▲ 使用注意事項(xiàng):

ButterKinfe的注解標(biāo)簽因版本不同而有所變化。

8.0.0之前的Bind標(biāo)簽在8.0.0之后變成了BindView,而8.7.0之后在綁定view時,要用R2.id.XXX而不再是常用的R.id.XXX了。

具體變化情況和查看gitHub上的提交日志:

  • https://github.com/JakeWharton/butterknife/blob/master/CHANGELOG.md#version-800-2016-04-25

默認(rèn)情況下,@bind和 listener 的綁定是必需的。如果無法找到目標(biāo)視圖,將拋出一個異常。

要抑制此行為并創(chuàng)建可選綁定,可以將@Nullable注解添加到字段中,或?qū)Optional注解添加到方法。

任何被命名為@Nullable的注解都可以用于成員變量。建議使用android的”support-annotations”庫中的@Nullable注解。

  1. @Nullable   
  2. @BindView(R.id.might_not_be_there)    
  3. TextView mightNotBeThere;   
  4.  
  5. @Optional   
  6. @OnClick(R.id.maybe_missing)    
  7. public void onMaybeMissingClicked() {   
  8.     // TODO ...   
  9. }   

▲ 更多綁定注解:

  • @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—->點(diǎn)擊事件
  • @OnCheckedChanged —->選中,取消選中
  • @OnEditorAction —->軟鍵盤的功能鍵
  • @OnFocusChange —->焦點(diǎn)改變
  • @OnItemClick item—->被點(diǎn)擊(注意這里有坑,如果item里面有Button等這些有點(diǎn)擊的控件事件的,需要設(shè)置這些控件屬性focusable為false)
  • @OnItemLongClick item—->長按(返回真可以攔截onItemClick)
  • @OnItemSelected —->item被選擇事件
  • @OnLongClick —->長按事件
  • @OnPageChange —->頁面改變事件
  • @OnTextChanged —->EditText里面的文本變化事件
  • @OnTouch —->觸摸事件
  • @Optional —->選擇性注入,如果當(dāng)前對象不存在,就會拋出一個異常,為了壓制這個異常,可以在變量或者方法上加入一下注解,讓注入變成選擇性的,如果目標(biāo)View存在,則注入, 不存在,則什么事情都不做
  1. //Test @Optional 
  2. @Optional   
  3. @OnCheckedChanged(R.id.cb_test)   
  4. public void onCheckedChanged(CompoundButton buttonView,boolean isChecked){   
  5.     if(isChecked){   
  6.         tvTest.setText("被選中...");   
  7.     }else{   
  8.         tvTest.setText("被取消...");   
  9.     }   

ButterKnife的代碼混淆

在混淆文件中,添加如下代碼:

 

  1. -keep class butterknife.** { *; }   
  2. -dontwarn butterknife.internal.**   
  3. -keep class **$$ViewBinder { *; }   
  4.  
  5. -keepclasseswithmembernames class * {   
  6.     @butterknife.* <fields>;   
  7. }   
  8.  
  9. -keepclasseswithmembernames class * {   
  10.     @butterknife.* <methods>;   
  11. }   

插件安裝:

工具欄File 找到Settings…或者使用快捷點(diǎn)Ctrl+Alt+s 打開。搜索zelezny下載插件并安裝,重啟Android Studio

Android Butterknife(黃油刀) 使用方法總結(jié)

插件使用:

安裝完成插件后,會提示重啟AS,重啟完后,可以寫一個布局并且新建一個代碼類測試下。測試的過程中要注意的是,需要將光標(biāo)移到setContentView(R.layout.acty_login),將光標(biāo)放到R.layout.acty_login,然后右鍵Generate就有了。這里引用一張gif效果圖,更直觀表現(xiàn)出插件帶來的優(yōu)勢。對于多個需要綁定的id,省下了需要自己手動敲打代碼的時間。

Android Butterknife(黃油刀) 使用方法總結(jié)

責(zé)任編輯:未麗燕 來源: Android開發(fā)中文站
相關(guān)推薦

2010-02-02 09:32:32

C++ typedef

2013-07-25 14:12:53

iOS開發(fā)學(xué)習(xí)UITableView

2009-11-16 13:57:21

PHP上傳文件

2023-02-08 08:40:21

2010-01-28 17:07:03

Android Gal

2011-02-24 13:09:10

FireFTP

2012-01-13 09:55:54

jQuery

2010-11-19 09:56:38

SQLiteAndroid

2010-01-27 14:18:41

Android智能指針

2017-06-14 18:09:02

ButterknifeAndroid

2013-06-08 17:09:35

Android開發(fā)移動開發(fā)XML解析

2009-12-24 16:36:06

WPF InkCanv

2010-02-04 10:52:36

C++字符串分割函數(shù)

2010-05-28 19:12:09

MySQL使用方法

2009-12-28 13:28:03

WPF視頻

2011-04-08 10:43:44

2017-08-18 14:01:44

大數(shù)據(jù)dataWrangle

2011-04-27 16:38:31

投影機(jī)

2010-03-04 15:17:30

Python prin

2009-12-16 15:05:15

Visual Stud
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號