精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

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

前言:

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

通過學習本文,學會如何在項目中使用ButterKnife。本文包含以下要點:

前言

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

ButterKnife項目地址:https://github.com/JakeWharton/butterknife

▲ ButterKnife的優勢:

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

基本配置

在android Studio項目中配置使用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' 

構建環境特別簡單,接下來看看如何使用

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

▲ 在Activity中綁定ButterKnife:

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

  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中將視圖設置為null。當你調用bind來為你綁定一個Fragment時,Butter Knife會返回一個Unbinder的實例。在適當的生命周期(onDestroyView)回調中調用它的unbind方法進行Fragment解綁。使用ButterKnife.bind(this, view)進行綁定。代碼如下:

  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值(進行解綁),注意這里的this不能使用getActivity()   
  8.         unbinder = ButterKnife.bind(this, view);   
  9.         return view;   
  10.     }   
  11.  
  12.     /**  
  13.      * onDestroyView中進行解綁操作  
  14.      */   
  15.     @Override   
  16.     public void onDestroyView() {   
  17.         super.onDestroyView();   
  18.         unbinder.unbind();   
  19.     }   
  20. }  

▲ 在Adapter中綁定ButterKnife:

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

  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;  

布局內多個控件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數組:@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數組   
  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. }   

▲ 事件綁定:

綁定點擊事件:

  • 綁定控件點擊事件:@OnClick( )
  • 綁定控件長按事件:@OnLongClick( )
  1. public class MainActivity extends AppCompatActivity {   
  2.  
  3.     @OnClick(R2.id.button1 )   //給 button1 設置一個點擊事件   
  4.     public void showToast(){   
  5.         Toast.makeText(this, "is a click", Toast.LENGTH_SHORT).show();   
  6.     }   
  7.  
  8.     @OnLongClick( R2.id.button1 )    //給 button1 設置一個長按事件   
  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:當涉及綁定多個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("我是點擊事件1");   
  10.                 break;   
  11.             case R.id.ll_product_lilv:   
  12.                 System.out.print("我是點擊事件2");   
  13.                 break;   
  14.             case R.id.ll_product_qixian:   
  15.                 System.out.print("我是點擊事件3");   
  16.  
  17.                 break;   
  18.             case R.id.ll_product_repayment_methods:   
  19.                 System.out.print("我是點擊事件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.     }   

通過上面的例子可以看出多條點擊事件是沒有用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("我是點擊事件1");                
  6.     }     
  7.     @OnClick(R2.id.ll_product_lilv)     
  8.     public void onViewClicked2(View view) {     
  9.        System.out.print("我是點擊事件2");      
  10.     }    
  11.     @OnClick(R2.id.ll_product_qixian)     
  12.     public void onViewClicked3(View view) {     
  13.        System.out.print("我是點擊事件3");                
  14.     }     
  15.     @OnClick(R2.id.ll_product_repayment_methods)     
  16.     public void onViewClicked4(View view) {     
  17.        System.out.print("我是點擊事件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覺得好像跟實現點擊事件的方法類似。實際上并沒有實現OnClickListener接口。代碼如下:

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

▲ 綁定監聽:

Listeners可以自動配置到方法中

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

對監聽器方法的所有參數都是可選的

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

自定義一個特定類型,它將自動被轉換

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

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

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

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

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

Listener中多方法注解

方法注解,其對應的監聽器有多個回調,可用于綁定到其中任何一個。每個注解都有一個它綁定的默認回調。使用回調參數指定一個替換。以Spinner為例。

原本代碼:

  1. Spinner s=new Spinner(this);   
  2.        //原始方法:Spinner 條目選擇監聽事件 正常寫法   
  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  作選擇監聽事件處理方式*/   
  3.     @OnItemSelected(R.id.my_spiner)//默認callback為ITEM_SELECTED   
  4.     void onItemSelected(int position) {   
  5.         Toast.makeText(this, "position: " + position, Toast.LENGTH_SHORT).show();   
  6.     }   
  7.     /*  
  8.     * 注解onNothingSelected,需要在注解參數添加一個callback,  
  9.     * 注意的是Spinner中只要有數據,默認都會選中第0個數據,所以想進入到onNothingSelected()方法,就需要把Adapter中的數據都清空  
  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監聽的使用

原方法應是: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){//注意:這里一定要有這個判斷,只有對應該id的按鈕被點擊了,ischanged狀態發生改變,才會執行下面的內容   
  46.                     //這里寫你的按鈕變化狀態的UI及相關邏輯   
  47.                 }   
  48.                 break;   
  49.             case R.id.rg_wealth:   
  50.                 if (ischanged) {   
  51.                     //這里寫你的按鈕變化狀態的UI及相關邏輯   
  52.                 }   
  53.                 break;   
  54.             case R.id.rg_account:   
  55.                 if (ischanged) {   
  56.                     //這里寫你的按鈕變化狀態的UI及相關邏輯   
  57.                 }   
  58.                 break;   
  59.             default:   
  60.                 break;   
  61.         }   
  62.     }  

▲ 使用findById:

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

  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);   

▲ 設置多個view的屬性:

apply()

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

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.         //設置多個view的屬性   
  15.         //方式1:傳遞值   
  16.         ButterKnife.apply(nameViews, DISABLE);   
  17.         //方式2:指定值   
  18.         ButterKnife.apply(nameViews, ENABLED, false);   
  19.         ////方式3 設置View的Property   
  20.         ButterKnife.apply(nameViews, View.ALPHA, 0.0f);//一個Android屬性也可以用于應用的方法。   
  21.     }   
  22.  
  23.     /*  
  24.     * Action接口設置屬性  
  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接口設置屬性  
  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. }  

▲ 使用注意事項:

ButterKinfe的注解標簽因版本不同而有所變化。

8.0.0之前的Bind標簽在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

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

要抑制此行為并創建可選綁定,可以將@Nullable注解添加到字段中,或將@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數組;@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存在,則注入, 不存在,則什么事情都不做
  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…或者使用快捷點Ctrl+Alt+s 打開。搜索zelezny下載插件并安裝,重啟Android Studio

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

插件使用:

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

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

責任編輯:未麗燕 來源: Android開發中文站
相關推薦

2010-02-02 09:32:32

C++ typedef

2013-07-25 14:12:53

iOS開發學習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

2017-06-14 18:09:02

ButterknifeAndroid

2010-11-19 09:56:38

SQLiteAndroid

2010-01-27 14:18:41

Android智能指針

2009-12-24 16:36:06

WPF InkCanv

2013-06-08 17:09:35

Android開發移動開發XML解析

2010-02-04 10:52:36

C++字符串分割函數

2011-04-08 10:43:44

2010-05-28 19:12:09

MySQL使用方法

2009-12-28 13:28:03

WPF視頻

2017-08-18 14:01:44

大數據dataWrangle

2011-04-27 16:38:31

投影機

2009-12-16 15:05:15

Visual Stud

2022-02-26 08:39:09

LinuxScp命令
點贊
收藏

51CTO技術棧公眾號

欧美亚洲一区二区在线观看| 91在线国产观看| 大胆人体色综合| 800av在线播放| 国产91精品在线| 亚洲国产精品天堂| 天堂社区 天堂综合网 天堂资源最新版 | 粉嫩av一区二区三区天美传媒 | 色悠久久久久综合先锋影音下载| 婷婷一区二区三区| 一区二区三区四区欧美日韩| 天天操天天操天天| 国内精品伊人久久久久av一坑| 97热精品视频官网| 黄色一级大片在线免费观看| 一区二区三区四区在线看| 欧美一级在线视频| 色综合天天色综合| 手机在线观看av| 亚洲日本va在线观看| 久久精品午夜一区二区福利| 国产农村妇女毛片精品| 久久高清一区| 国模gogo一区二区大胆私拍| 久热这里有精品| 欧美艳星介绍134位艳星| 日韩欧美一级特黄在线播放| 亚洲欧美另类动漫| 自拍视频在线看| 五月婷婷综合网| 国产成人亚洲综合无码| 巨大荫蒂视频欧美另类大| 91啪九色porn原创视频在线观看| 国产91精品一区二区绿帽| 国产精品高潮呻吟久久久| 免费人成精品欧美精品| 日韩av高清不卡| 九九热在线视频播放| 最新亚洲一区| 久久久久久噜噜噜久久久精品| www青青草原| 在线成人超碰| 九九综合九九综合| 亚洲色图综合区| 你懂的视频一区二区| 日韩在线视频网站| 内射一区二区三区| 亚洲精品97| 欧美成人免费全部| 澳门黄色一级片| 亚洲网站视频| 午夜精品久久久99热福利| 国产亚洲自拍av| 一区在线播放| 欧美亚洲第一页| 免费污污视频在线观看| 日韩制服丝袜av| 国产精品久久久久久久久久久久久 | 99精品视频精品精品视频| 色偷偷偷综合中文字幕;dd| 四虎成人免费影院| 天天插综合网| 欧美人成在线视频| 国产一级淫片a| 国产日韩高清一区二区三区在线| 51ⅴ精品国产91久久久久久| 中文字幕精品无| 久久精品国产免费| 114国产精品久久免费观看| 成人av手机在线| jiyouzz国产精品久久| 久久伊人资源站| 国产黄色免费在线观看| 亚洲天堂av老司机| 成人免费视频91| 小黄鸭精品aⅴ导航网站入口| 欧美图片一区二区三区| 性生活在线视频| 粉嫩av一区二区| 亚洲人成网站777色婷婷| fc2ppv在线播放| 亚洲小说欧美另类婷婷| 日本久久精品视频| 国产女18毛片多18精品| 99久精品国产| 亚洲人成网站在线观看播放| 欧美aaa免费| 日本韩国精品在线| 在线观看免费视频污| 色老板在线视频一区二区| 国产一区二区三区在线观看视频 | 91精品国产欧美一区二区成人 | 中文字幕av不卡在线| 日韩精品一级| 亚洲天堂男人天堂女人天堂| 18岁成人毛片| 日韩成人精品在线观看| 成人影片在线播放| yw193.com尤物在线| 亚洲综合一区二区精品导航| 久久黄色免费看| 超碰精品在线观看| 伊人久久精品视频| 日韩欧美一区二区一幕| 精品在线一区二区三区| 欧美乱偷一区二区三区在线| 91香蕉在线观看| 欧洲精品一区二区| 久久久久成人精品无码中文字幕| 久久久9色精品国产一区二区三区| 8x海外华人永久免费日韩内陆视频| 亚洲天堂视频在线| 久久综合丝袜日本网| 9191国产视频| 亚洲色图图片| 亚洲色图国产精品| 91香蕉在线视频| 国产精品88av| 欧美爱爱视频网站| 日韩另类视频| 精品无人区乱码1区2区3区在线| 波多野结衣家庭教师| 日本中文一区二区三区| 玛丽玛丽电影原版免费观看1977| 黄色成人在线网| 777奇米成人网| 日本女人性生活视频| 久久人人精品| 欧美日韩高清在线一区| 高潮在线视频| 亚洲国产成人精品女人久久久| 日韩在线观看视频一区二区| 精品一区二区精品| 一区不卡字幕| 日韩午夜电影免费看| 国产一区二区三区在线看| 91在线视频在线观看| 成+人+亚洲+综合天堂| 国产a级黄色大片| 国产精品美女久久久久人| 日韩中文娱乐网| 亚洲天堂一二三| 国产精品电影一区二区| 亚洲国产高清av| 久久国产小视频| 国产色综合天天综合网| 亚洲乱亚洲乱妇| 欧美日韩二区三区| 亚洲 欧美 变态 另类 综合| 国产在线播精品第三| 加勒比海盗1在线观看免费国语版| 久久久久毛片免费观看| 欧美日韩国产成人| 丰满大乳国产精品| 黑人巨大精品欧美一区二区一视频| 女同性恋一区二区三区| 香蕉亚洲视频| 日韩精彩视频| 91麻豆精品| 久久久久久国产精品三级玉女聊斋| 亚洲黄色精品视频| 精品久久久一区二区| 亚洲成人网在线播放| 奇米精品一区二区三区在线观看| 一本久久a久久精品vr综合| 国产不卡精品在线| 欧美激情免费观看| 同心难改在线观看| 欧美色倩网站大全免费| 午夜国产小视频| 成人做爰69片免费看网站| 久久av综合网| 久久av电影| 成人免费观看a| 丰乳肥臀在线| 一区二区欧美日韩视频| 国产绳艺sm调教室论坛| 午夜精品福利一区二区三区蜜桃| 久久精品视频18| 国产一区二区三区视频在线播放| 欧美一级视频在线播放| 欧美人与物videos另类xxxxx| 国产日韩精品在线播放| wwwwxxxx在线观看| 国产亚洲精品一区二555| 国产av一区二区三区| 精品日韩中文字幕| 三级黄色在线观看| 成人在线视频一区二区| 亚洲激情在线观看视频| 黄色精品免费| 五月天综合网| 精品三级av在线导航| 国产狼人综合免费视频| 蜜桃成人365av| 中文欧美日本在线资源| 神宫寺奈绪一区二区三区| 欧美日免费三级在线| 久久午夜无码鲁丝片| 中文字幕av一区二区三区高 | 九一精品在线观看| 欧美日韩一视频区二区| 亚洲免费久久| 希岛爱理av免费一区二区| 亚洲自拍偷拍视频| 99久久精品一区二区成人| 97国产精品视频人人做人人爱| 日本中文在线观看| 亚洲人高潮女人毛茸茸| 人妻无码中文字幕免费视频蜜桃| 欧美日韩国产影片| 9i精品福利一区二区三区| 夜夜嗨av一区二区三区| 粉嫩精品久久99综合一区| av电影在线观看不卡| 日本黄色三级网站| 精品制服美女久久| 人妻丰满熟妇av无码区app| 国产日韩欧美一区在线| 日韩精品综合在线| 亚洲天天影视网| 一区精品在线| 色综合天天综合网中文字幕| 日本精品一区二区三区高清 久久| 久久动漫网址| 肥熟一91porny丨九色丨| 国产一区二区三区精品在线观看 | 国产成人精品视频ⅴa片软件竹菊| 在线日本成人| 国产一二三在线视频| 中文字幕一区二区三三| 最新中文字幕久久| 国产精品传媒精东影业在线| 一区二区免费在线观看| 日韩理论片av| 一区二区精品在线观看| 欧美gay男男猛男无套| 亚洲aⅴ天堂av在线电影软件| 国产麻豆精品久久| 日本一区二区精品| 精品99久久| 日韩一区二区三区高清| 欧美色婷婷久久99精品红桃| 日韩国产精品一区二区| 狠狠色狠狠色综合婷婷tag| 日本在线观看一区二区三区| 偷拍精品福利视频导航| 欧美成人第一区| 国产一区毛片| 亚洲精品在线免费| 日韩欧美视频| 警花观音坐莲激情销魂小说| 一本一本久久a久久综合精品| 国产成人三级视频| 女主播福利一区| 国产真人做爰毛片视频直播| 日韩香蕉视频| 日韩亚洲在线视频| 久久精品国产亚洲aⅴ| 国产又黄又猛的视频| 国产精品一二三四区| 国产原创剧情av| 久久亚洲一区二区三区明星换脸| 精品人妻无码一区| 亚洲欧洲精品成人久久奇米网| 久热这里有精品| 五月天一区二区三区| 日韩综合在线观看| 678五月天丁香亚洲综合网| www.五月激情| 亚洲精品一区在线观看香蕉| 国产69久久| 欧美成人h版在线观看| 国产白浆在线免费观看| 国产精品91久久久| 精品麻豆剧传媒av国产九九九| 国产伦精品一区二区三| 精品久久不卡| 热久久最新地址| 丝袜诱惑制服诱惑色一区在线观看 | 青青草偷拍视频| 精品欧美一区二区三区| 羞羞色院91蜜桃| 日韩精品一区二区三区视频在线观看| 污视频软件在线观看| 中文字幕亚洲天堂| 成人在线高清免费| 国产精品扒开腿做爽爽爽男男| 国产精品亚洲欧美一级在线| 久久久神马电影| 亚洲美女视频| 日本成人在线免费视频| 国产东北露脸精品视频| a级在线免费观看| 亚洲尤物视频在线| 一区二区视频播放| 亚洲精品久久久久国产| 黄色免费网站在线| 欧洲精品久久久| 亚洲国产中文在线二区三区免| 欧美少妇一区| 狠狠爱www人成狠狠爱综合网| 无码无遮挡又大又爽又黄的视频| 国产美女精品一区二区三区| 中文字幕一区二区三区人妻电影| 亚洲色图视频网| 欧美日韩 一区二区三区| 精品国产不卡一区二区三区| 精品国产丝袜高跟鞋| 日韩免费观看高清| 久久综合另类图片小说| 2021狠狠干| 美国毛片一区二区| 粉嫩av蜜桃av蜜臀av| 亚洲亚洲人成综合网络| 国产精品国产一区二区三区四区| 亚洲一区999| 在线一区av| 国产视频不卡| 欧美日韩国产精品一区二区亚洲| 午夜久久福利视频| 欧美国产精品劲爆| 无码人妻一区二区三区线| 亚洲国产精品福利| 电影k8一区二区三区久久| 亚洲va久久久噜噜噜久久天堂| 欧美日韩一二| 天天干在线影院| 久久精品视频一区| 中文字幕一区在线播放| 日韩成人激情视频| 色戒汤唯在线观看| 精品视频在线观看| 亚洲美女色禁图| 国模私拍在线观看| 亚洲国产精品视频| 四虎永久在线精品免费网址| 欧美精品www| 国内自拍欧美| 久久国产亚洲精品无码| 99re6这里只有精品视频在线观看| 国产无遮挡又黄又爽| 欧美精品一区二区三区视频| 91九色在线播放| 国产欧美亚洲日本| 国产精品入口| 91精彩刺激对白露脸偷拍| 一本久久精品一区二区| 国产在线观看网站| 国产精选久久久久久| 97精品国产一区二区三区 | 99久久99久久精品免费观看| 精品91久久久| 亚洲天堂网站在线观看视频| 电影在线观看一区二区| 日韩欧美亚洲在线| 久久国产精品一区二区| 可以直接看的黄色网址| 精品国产亚洲在线| 制服丝袜专区在线| 视频一区不卡| 国产一区不卡在线| 国产午夜福利精品| 亚洲精选中文字幕| 国产第一精品| 草草草视频在线观看| 97久久精品人人爽人人爽蜜臀| 日日夜夜狠狠操| 中文字幕亚洲欧美在线| 日韩在线精品强乱中文字幕| 欧美爱爱视频免费看| 蜜乳av综合| 欧美一区三区四区| 亚洲精品喷潮一区二区三区| 97视频网站入口| 凹凸成人精品亚洲精品密奴| 亚洲图片 自拍偷拍| 岛国av一区二区| 永久免费av在线| 动漫美女被爆操久久久| 久久高清免费观看| 欧美大片xxxx| 精品视频在线播放| 91精品国产自产观看在线| 草草视频在线免费观看| 国产欧美日韩麻豆91| www黄色网址| 国产精品久久久久久久久久久新郎 | 欧美另类交人妖| 欧美人妖在线| 蜜臀av粉嫩av懂色av| 欧美日精品一区视频| 阿v视频在线| 中文字幕av日韩精品| 99视频一区二区| av资源免费看| 国产精品久久久久影院日本 | 亚洲美女免费在线| 激情视频在线观看免费| 粉嫩高清一区二区三区精品视频|