成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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,你可以立刻調用此方法。或者,從XML 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。看代碼覺得好像跟實現點擊事件的方法類似。實際上并沒有實現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

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開發移動開發XML解析

2009-12-24 16:36:06

WPF InkCanv

2010-02-04 10:52:36

C++字符串分割函數

2009-12-28 13:28:03

WPF視頻

2010-05-28 19:12:09

MySQL使用方法

2017-08-18 14:01:44

大數據dataWrangle

2011-04-08 10:43:44

2011-04-27 16:38:31

投影機

2009-12-16 15:05:15

Visual Stud

2009-09-05 10:26:20

Linux壓縮打包命令Linux命令
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99久久久国产精品免费消防器 | 久久精品免费 | 色婷婷综合网站 | 中文成人在线 | 免费看片在线播放 | 91视视频在线观看入口直接观看 | 宅男噜噜噜66一区二区 | 尤物在线视频 | 999视频在线播放 | 国产一区二区在线观看视频 | 久久国产精品免费一区二区三区 | 欧美在线观看黄色 | 91.xxx.高清在线 | 99热.com| 国产三级一区二区 | 欧美精品1区 | 美女三区| 欧美一级淫片007 | 亚洲高清在线 | 久久久久一区 | 中文字幕精品一区二区三区在线 | 爱爱视频在线观看 | 久久久久成人精品 | 99精品欧美一区二区蜜桃免费 | 日韩在线精品视频 | 中文字幕亚洲精品 | 久久99精品久久久 | 色精品视频 | 三级成人在线 | 亚洲综合在线一区二区 | 天天干天天干 | 国产小视频在线 | 在线中文视频 | 亚洲一区二区三区免费在线观看 | 国产成人精品一区二区三 | 欧美日韩高清免费 | 欧美成人精品二区三区99精品 | 国产精品欧美一区二区三区不卡 | 色网站在线免费观看 | 国产黄色麻豆视频 | 日日干夜夜操 |