日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
一篇文章玩轉(zhuǎn)ButterKnife,讓代碼更簡潔

前言

成都創(chuàng)新互聯(lián)是一家專業(yè)提供長寧企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、網(wǎng)站設(shè)計、H5開發(fā)、小程序制作等業(yè)務(wù)。10年已為長寧眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。

話說,Android開發(fā)的兄弟們都知道,每次初始化控件,設(shè)置相應(yīng)的事件,寫的那點(diǎn)過程多而且惡心。我們先一塊回顧下不堪的曾經(jīng)~那些年,我們是這樣初始化控件:

 
 
 
 
  1. // 每次的習(xí)慣上來寫一個initView()方法 
  2. tvContent = (TextView) findViewById(R.id.btn_content); 
  3. // 遇到項(xiàng)目大的時候,這里面的東西,也曾占據(jù)半壁江山??嗖豢把?nbsp;
  4. // 當(dāng)然也曾封裝過方法,避免各種findViewById,但是依舊如此。  

那些年,我們是這樣設(shè)置事件:

 
 
 
 
  1. tvContent.setOnClickListener(this); 
  2. // 當(dāng)然,LZ的習(xí)慣依舊扔到initView中,讓他們盡情的浪蕩,放縱~  

But,騷年,身為一個Android開發(fā),你還能繼續(xù)忍受這種不堪的摧殘么?答案當(dāng)然不能!

那么,接下來為大家?guī)硪粋€神器,助我們開發(fā)高效,快捷~

Butterknife 初識

ButterKnife,又被戲稱為黃油刀,至于為什么被戲稱為這個,大家可以看下面附上的從官方截取的icon~

一塊桌布,一個盤子,一個Android小機(jī)器人形狀的黃油,一把刀。這些合起來被大家戲稱為黃油刀。(我說呢,糾結(jié)我半天,都搞不懂黃油刀是個什么鬼,這次曉得了)icon下面簡單解釋就是為Android 視圖(View)提供綁定字段和方法。 也就是說,我們今后可以通過這把刀去替換之前瑣碎的初始化~

大家有興趣的也可以去官網(wǎng)上看看,下面為大家附上官網(wǎng)地址以及GitHub地址捎帶的附帶個api地址。

官方地址:http://jakewharton.github.io/butterknife/

GitHub地址:https://github.com/JakeWharton/butterknife

API訪問地址:http://jakewharton.github.io/butterknife/javadoc/

話說,簡單了解之后,還是來點(diǎn)干貨吧~不然說不過去哈

首先我們要明白,ButterKnife 是出自Android大神JakeWharton之手的一個開源庫,它的作用就是通過注解綁定視圖的方法,從而簡化代碼量(減少我們當(dāng)年findViewById以及設(shè)置事件時編寫的大量代碼)。

而我們使用一個東西,必須要知道他的優(yōu)勢在哪兒?我用它能給我?guī)硎裁捶奖阒?那么接下來,我們看看這把“黃油刀”有著什么樣的優(yōu)勢,從而能簡化我們一些代碼?

ButterKnife 優(yōu)勢

1. 強(qiáng)大的View綁定,Click事件處理功能以及資源內(nèi)容,簡化代碼,提升開發(fā)效率;

2. 方便的處理Adapter里的ViewHolder綁定問題;

3. 運(yùn)行時不會影響APP效率,使用配置方便;

4. 代碼清晰,可讀性強(qiáng)。

了解完ButterKnife優(yōu)勢后,懷著好奇心,我們看看他都支持哪兒些方面,換句話說就是,我們開發(fā)過程中,在什么情況下可以通過使用ButterKnife去減少我們曾經(jīng)的代碼量?

ButterKnife 使用場景

  • View(視圖)綁定:例如初始化控件;
  • 資源綁定:例如color,string等;
  • 非Activity綁定:這里值得是當(dāng)時用 fragment 的時候;
  • View List 綁定: Adapter 中 ViewHolder,具體使用會在下方講解;
  • Listener 綁定:這個就好理解了,也就是平時控件所需監(jiān)聽事件。

ButterKnife 語法

1. activity fragment 綁定與 fragment解綁

想要使用ButterKnife,簡單配置之后,我們還需要在Activity中onCreate()綁定,如下:

 
 
 
 
  1. @Override 
  2.     protected void onCreate(Bundle savedInstanceState) { 
  3.         super.onCreate(savedInstanceState); 
  4.         setContentView(R.layout.activity_main); 
  5.         // 必須在setContentView()之后綁定 
  6.         ButterKnife.bind(this);  
  7.     }  

而如果使用fragment,官方給出的綁定以及解綁如下:

 
 
 
 
  1. public class FancyFragment extends Fragment { 
  2.   @BindView(R.id.button1) Button button1; 
  3.   @BindView(R.id.button2) Button button2; 
  4.   private Unbinder unbinder; 
  5.  
  6.   @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
  7.     View view = inflater.inflate(R.layout.fancy_fragment, container, false); 
  8.     // 綁定 
  9.     unbinder = ButterKnife.bind(this, view); 
  10.     // TODO Use fields... 
  11.     return view; 
  12.   } 
  13.  
  14.   @Override public void onDestroyView() { 
  15.     super.onDestroyView(); 
  16.     // 解綁 
  17.     unbinder.unbind(); 
  18.   } 
  19. }  

綁定之后,我們一起來看看,常用的幾種監(jiān)聽通過使用ButterKnife之后,我們又該如何編寫相關(guān)事件呢?別急,往下看~

2.單擊事件

首先我們先看看人家表層提供我們代碼中,我們可以得到哪兒些對我們有用的信息

首先明確,targetType(目標(biāo)類型)為View,setter為setOnClickListener(單擊事件監(jiān)聽),type為ButterKnife封裝的單擊事件(butterknife.internal.DebouncingOnClickListener),而method中則是name為doClick以及parameters為View類型的倆個參數(shù);而下面的interface接口中需要我們傳遞一個id。

簡單了解后,我們衍生出三種寫法,如下:

 
 
 
 
  1. // 寫法1 
  2.    @OnClick(控件ID) 
  3.    void 方法名() { 
  4.        //業(yè)務(wù)邏輯操作 
  5.    } 
  6.     
  7.    // 寫法2 
  8.    @OnClick(控件ID) 
  9.    void 方法名(控件類型) { 
  10.        //業(yè)務(wù)邏輯操作 
  11.    } 
  12.     
  13.    // 寫法3 
  14.    @OnClick(控件ID) 
  15.    void 方法名(View view) { 
  16.        //業(yè)務(wù)邏輯操作 
  17.    }  

你可以按照上面指定一個個的寫,也可以綁定多個,如官網(wǎng)提供下面寫法:

3.長按事件

同樣依舊看人家怎么寫的,看看我們能了解到什么

和單擊事件對比,長按時間則多出了一個returnType(返回值),且默認(rèn)為false。So,寫法如下~

 
 
 
 
  1. // 方法1 
  2.    boolean 方法名(){ 
  3.        // 業(yè)務(wù)邏輯操作 
  4.        return false; 
  5.    } 
  6.     
  7.    // 方法2 
  8.    boolean 方法名(控件類型){ 
  9.        // 業(yè)務(wù)邏輯操作 
  10.        return false; 
  11.    } 
  12.  
  13.    // 方法3 
  14.    boolean 方法名(View view){ 
  15.        // 業(yè)務(wù)邏輯操作 
  16.        return false; 
  17.    }  

4.Checked改變事件

老規(guī)矩:

改變,一般來說,會提供我們一個標(biāo)識,去方便我們根據(jù)不同的狀態(tài)去處理不同的邏輯,so...

 
 
 
 
  1. // 寫法1 
  2.     @OnCheckedChanged(控件ID) 
  3.     void radioButtonCheckChange(boolean isl) { 
  4.         // 業(yè)務(wù)邏輯 
  5.     } 
  6.      
  7.     // 寫法2 
  8.     @OnCheckedChanged(控件ID) 
  9.     void radioButtonCheckChange(控件類型,boolean isl) { 
  10.         // 業(yè)務(wù)邏輯 
  11.     }  

5.監(jiān)聽軟鍵盤右下角按鈕事件

老規(guī)矩:

so...經(jīng)過上面幾個大家可以知道,我們只需要對parameters以及是否是returnType重點(diǎn)關(guān)注即可。

 
 
 
 
  1. // 寫法1 
  2.     @OnEditorAction(控件ID) 
  3.     boolean 方法名() { 
  4.         // 業(yè)務(wù)邏輯操作 
  5.         return false; 
  6.     } 
  7.  
  8.     // 寫法2 
  9.     // code:狀態(tài)碼 
  10.     @OnEditorAction(控件ID) 
  11.     boolean EditTextAction(int code) { 
  12.         // 業(yè)務(wù)邏輯操作 
  13.         return false; 
  14.     } 
  15.  
  16.     // 寫法3 
  17.     // KeyEvent 
  18.     @OnEditorAction(控件ID) 
  19.     boolean EditTextAction(KeyEvent keyEvent) { 
  20.         // 業(yè)務(wù)邏輯操作 
  21.         return false; 
  22.     } 
  23.  
  24.     // 寫法4 
  25.     @OnEditorAction(控件ID) 
  26.     boolean EditTextAction(int code, KeyEvent keyEvent) { 
  27.         // 業(yè)務(wù)邏輯操作 
  28.         return false; 
  29.     } 
  30.  
  31.     // 寫法5 
  32.     @OnEditorAction(控件ID) 
  33.     boolean EditTextAction(TextView textView,int code, KeyEvent keyEvent) { 
  34.         // 業(yè)務(wù)邏輯操作 
  35.         return false; 
  36.     }  

6. EditText內(nèi)容改變監(jiān)聽事件

由于源碼中內(nèi)容較長,不方便截圖,故截取部分代碼做解析,如下:

 
 
 
 
  1. @Target(METHOD) 
  2. @Retention(CLASS) 
  3. @ListenerClass( 
  4.     targetType = "android.widget.TextView", 
  5.     setter = "addTextChangedListener", 
  6.     remover = "removeTextChangedListener", 
  7.     type = "android.text.TextWatcher",   --->   這里同樣對之前的TextWatcher做了相關(guān)處理 ggg 
  8.     callbacks = OnTextChanged.Callback.class   --->   自定義枚舉,通過枚舉類型標(biāo)識當(dāng)前操作 666 
  9. public @interface OnTextChanged { 
  10.   /** View IDs to which the method will be bound. */ 
  11.   @IdRes int[] value() default { View.NO_ID };   --->   需要傳入ID 
  12.  
  13.   /** Listener callback to which the method will be bound. */ 
  14.   Callback callback() default Callback.TEXT_CHANGED;  --->  未改變狀態(tài) 
  15.  
  16.   /** {@link TextWatcher} callback methods. */ 
  17.   enum Callback {  --->  枚舉中分為三種類似 未改變 改變前 改變后 
  18.     /** {@link TextWatcher#onTextChanged(CharSequence, int, int, int)} */ 
  19.     @ListenerMethod( 
  20.         name = "onTextChanged",  --->  當(dāng)前標(biāo)識為 未改變 
  21.         parameters = { 
  22.             "java.lang.CharSequence",  --->  用戶輸入字符 
  23.             "int", --->  改變前個數(shù) 
  24.             "int", --->  測試時,返回0,沒整明白代表什么意思 
  25.             "int"  --->  根據(jù)打印結(jié)果,猜測這個應(yīng)該是每次增加內(nèi)容個數(shù) 
  26.         } 
  27.     ) 
  28.     TEXT_CHANGED, 
  29.  
  30.     /** {@link TextWatcher#beforeTextChanged(CharSequence, int, int, int)} */ 
  31.     @ListenerMethod( 
  32.         name = "beforeTextChanged",  --->  當(dāng)前標(biāo)識為 改變前 
  33.         parameters = { 
  34.             "java.lang.CharSequence",  --->  用戶輸入字符 
  35.             "int", --->  改變前個數(shù) 
  36.             "int", 
  37.             "int" 
  38.         } 
  39.     ) 
  40.     BEFORE_TEXT_CHANGED, 
  41.  
  42.     /** {@link TextWatcher#afterTextChanged(android.text.Editable)} */ 
  43.     @ListenerMethod( 
  44.         name = "afterTextChanged",  --->  當(dāng)前標(biāo)識為 改變后 
  45.         parameters = "android.text.Editable"  --->  用戶輸入字符 
  46.     ) 
  47.     AFTER_TEXT_CHANGED, --->  我們關(guān)注的重點(diǎn)在此,每次只需要監(jiān)聽這個,去做相關(guān)處理即可 
  48.   }  

從上得知,關(guān)于EditText內(nèi)容改變事件,我們關(guān)注點(diǎn)只在乎改變后的內(nèi)容格式(個數(shù))是否符合項(xiàng)目需求,而其他可以暫時忽略,從而衍生下面寫法:

 
 
 
 
  1. // 內(nèi)容改變后監(jiān)聽 
  2.     // Editable editable:用戶輸入字符 
  3.     @OnTextChanged(value = 控件ID, callback = 監(jiān)聽類型,改變后取值為:OnTextChanged.Callback.AFTER_TEXT_CHANGED) 
  4.     void editTextChangeAfter(Editable editable) { 
  5.         // 業(yè)務(wù)邏輯 
  6.     } 
  7.  
  8.     // 內(nèi)容改變前監(jiān)聽 
  9.     @OnTextChanged(value = 控件ID, callback = 監(jiān)聽類型,改變前取值為:OnTextChanged.Callback.BEFORE_TEXT_CHANGED) 
  10.     void editTextChangeBefore(CharSequence s, int start) { 
  11.         // 業(yè)務(wù)邏輯 
  12.     } 
  13.  
  14.     // 內(nèi)容未發(fā)生改變監(jiān)聽 
  15.     @OnTextChanged(value = 控件ID, callback = 監(jiān)聽類型,取值為:OnTextChanged.Callback.TEXT_CHANGED) 
  16.     void editTextChange(CharSequence s, int start) { 
  17.         // 業(yè)務(wù)邏輯 
  18.     }  

7. 焦點(diǎn)監(jiān)聽事件

老規(guī)矩:

由此可見,如下:

 
 
 
 
  1. @OnFocusChange(控件ID) 
  2.     void editTextFocus(boolean isl){ 
  3.         // 業(yè)務(wù)邏輯 
  4.     }  

8. 觸摸監(jiān)聽事件

老規(guī)矩:

寫法如下:

 
 
 
 
  1. @OnTouch(控件ID) 
  2.     boolean imageView(MotionEvent event){ 
  3.         // 業(yè)務(wù)邏輯 
  4.         return false; 
  5.     }  

9. item項(xiàng)單擊監(jiān)聽事件

老規(guī)矩: 

 

so...

 
 
 
 
  1. @OnItemClick(控件ID) 
  2.     void listItemClick(int position){ 
  3.         // 業(yè)務(wù)邏輯 
  4.     }  

10. item項(xiàng)長按監(jiān)聽事件

老規(guī)矩: 

so...

 
 
 
 
  1. @OnItemLongClick(R.id.listView) 
  2.     boolean listItemLongClick(int position) { 
  3.         Toast.makeText(this, "OnItemLongClick---點(diǎn)擊了第" + position + "個", Toast.LENGTH_SHORT).show(); 
  4.         return true; 
  5.     } 

 

ButterKnife 使用注意

1.Activity ButterKnife.bind(this) 必須在 setContentView() 之后,且父類 bind 綁定后,子類不需要再 bind;

2.Fragment 中使用需要傳入view:Fragment ButterKnife.bind(this, mRootView);

3.屬性布局不能用private or static 修飾,否則會報錯;

4.setContentView()不能通過注解實(shí)現(xiàn)。(其他的有些注解框架可以)

通過上面簡單介紹,相信大家對這把刀已經(jīng)有了一個初步的理解,那么如何在Android Studio中通過使用這把刀從而改善我們的代碼呢?我們接著往下瞧。

Android Studio使用ButterKnife前期準(zhǔn)備操作

想要在Android Studio中使用ButterKnife,首先需要下載安裝ButterKnife插件,之后經(jīng)過簡單配置之后方可使用~

***步:Android Studio集成ButterKnife插件

1.點(diǎn)擊 File ---> Settings... ---> 選擇 Plugins(也可以使用快捷鍵 Ctrl+Alt+S) 

2.輸入ButterKnife,選擇“Android ButterKnife Zelezny”,點(diǎn)擊安裝(LZ這里已經(jīng)安裝好了),稍后Android Studio會提示重啟AS,確認(rèn)即可。 

3.經(jīng)過以上簡單倆步,我們的Android Studio又get了新技能,那就是:支持ButterKnife插件!

第二步:配置ButterKnife

1.使用前,我們需要對ButterKnife進(jìn)行簡單配置( 為我們的項(xiàng)目引入'com.jakewharton:butterknifecompiler:8.5.1','com.jakewharton:butterknife:8.5.1' ),引入過程如下所示: 

  

2.引入完成之后,我們先來小試牛刀~得瑟得瑟

在MainActivity中的onCreate 右鍵layout,選擇Generate... ,Generate ButterKnife Injections,選擇要使用注解的控件,點(diǎn)擊Confirm 

一鍵可視化操作,方便快捷~進(jìn)過上面的配置后,我們可以在項(xiàng)目中盡情的使用ButterKnife各種秀了~

刀法一部曲,玩轉(zhuǎn)常用事件監(jiān)聽

1.在MainActivity布局中新增幾個常用控件,通過右鍵layout,選擇Generate... ,Generate ButterKnife Injections,選擇要使用注解的控件,點(diǎn)擊Confirm ,從而生成我們接下來演示根本(后面會有所更改),如下圖所示~ 

 

 

接下來為大家演示相關(guān)事件使用,一點(diǎn)點(diǎn)玩轉(zhuǎn)黃油刀

1. 單擊事件(以TextView為例)

代碼如下:

 
 
 
 
  1. @OnClick(R.id.text) 
  2.     void textClick() { 
  3.         Toast.makeText(MainActivity.this, "TextView的單擊事件觸發(fā)。(無參-默認(rèn))", Toast.LENGTH_SHORT).show(); 
  4.     } 
  5.  
  6.     @OnClick(R.id.text) 
  7.     void textClick(TextView textView){ 
  8.         Toast.makeText(MainActivity.this, "TextView的單擊事件觸發(fā)。(TextView)", Toast.LENGTH_SHORT).show(); 
  9.     } 
  10.  
  11.     @OnClick(R.id.text) 
  12.     void textClick(View view){ 
  13.         Toast.makeText(MainActivity.this, "TextView的單擊事件觸發(fā)。(View)", Toast.LENGTH_SHORT).show(); 
  14.     } 

 

運(yùn)行結(jié)果展示: 

 

2. 長按事件(以Button為例)

代碼如下:

 
 
 
 
  1. @OnLongClick(R.id.button) 
  2.     boolean buttonLongClick(){ 
  3.         Toast.makeText(MainActivity.this, "Button的長按事件觸發(fā)。(無參-默認(rèn))", Toast.LENGTH_SHORT).show(); 
  4.         return false; 
  5.     } 
  6.  
  7. //    @OnLongClick(R.id.button) 
  8. //    boolean buttonLongClick(Button button){ 
  9. //        Toast.makeText(MainActivity.this, "Button的長按事件觸發(fā)。(TextView)", Toast.LENGTH_SHORT).show(); 
  10. //        return false; 
  11. //    } 
  12.  
  13. //    @OnLongClick(R.id.button) 
  14. //    boolean buttonLongClick(View view){ 
  15. //        Toast.makeText(MainActivity.this, "Button的長按事件觸發(fā)。(View)", Toast.LENGTH_SHORT).show(); 
  16. //        return false; 
  17. //    } 

 

運(yùn)行結(jié)果如下: 

這里大家可能會問了,LZ你干嘛要把下面的注釋掉了呢,是不是不能用呢?確實(shí),一開始沒有注釋,運(yùn)行時候出現(xiàn)異常,提示如下:

 
 
 
 
  1. Multiple listener methods with return value specified for ID:2131165193 

LZ理解為,這個監(jiān)聽只會為ID(2131165193)返回相應(yīng)監(jiān)聽,也就是一一對應(yīng)!so... 一山不容二虎,除非一公一母啊~

3. Checked改變事件(以CheckBox為例)

代碼如下:

 
 
 
 
  1. @OnCheckedChanged(R.id.checkBox) 
  2.     void radioButtonCheckChange(boolean isl) { 
  3.         Toast.makeText(MainActivity.this, "CheckBox。(無參)" + isl, Toast.LENGTH_SHORT).show(); 
  4.     } 
  5.  
  6.     @OnCheckedChanged(R.id.checkBox) 
  7.     void radioButtonCheckChange(CheckBox checkBox,boolean isl) { 
  8.         Toast.makeText(MainActivity.this, "CheckBox。(CheckBox)" + isl, Toast.LENGTH_SHORT).show(); 
  9.     } 

 

運(yùn)行結(jié)果如下: 

 

 

4. 監(jiān)聽軟鍵盤右下角按鈕事件

代碼如下:

 
 
 
 
  1. //    @OnEditorAction(R.id.tv_editor_action) 
  2. //    boolean EditTextAction() { 
  3. //        Toast.makeText(MainActivity.this, " 點(diǎn)擊---通往天堂 無參", Toast.LENGTH_SHORT).show(); 
  4. //        return false; 
  5. //    } 
  6.  
  7. //    @OnEditorAction(R.id.tv_editor_action) 
  8. //    boolean EditTextAction(int code) { 
  9. //        Toast.makeText(MainActivity.this, " 點(diǎn)擊---通往天堂 code:"+code, Toast.LENGTH_SHORT).show(); 
  10. //        return false; 
  11. //    } 
  12.  
  13. //    @OnEditorAction(R.id.tv_editor_action) 
  14. //    boolean EditTextAction(KeyEvent keyEvent) { 
  15. //        Toast.makeText(MainActivity.this, "點(diǎn)擊---通往天堂 KeyEvent:"+keyEvent, Toast.LENGTH_SHORT).show(); 
  16. //        return false; 
  17. //    } 
  18.  
  19. //    @OnEditorAction(R.id.tv_editor_action) 
  20. //    boolean EditTextAction(int code, KeyEvent keyEvent) { 
  21. //        Toast.makeText(MainActivity.this, "點(diǎn)擊---通往天堂 code:"+code+" KeyEvent:"+keyEvent, Toast.LENGTH_SHORT).show(); 
  22. //        return false; 
  23. //    } 
  24.  
  25.     @OnEditorAction(R.id.tv_editor_action) 
  26.     boolean EditTextAction(TextView textView,int code, KeyEvent keyEvent) { 
  27.         Toast.makeText(MainActivity.this, textView.getText().toString()+" 點(diǎn)擊---通往天堂 code:"+code+" KeyEvent:"+keyEvent, Toast.LENGTH_SHORT).show(); 
  28.         return false; 
  29.     } 

 

運(yùn)行效果下: 

5. EditText內(nèi)容改變監(jiān)聽事件

代碼如下:

 
 
 
 
  1. @OnTextChanged(value = R.id.editText, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED) 
  2.     void editTextChangeAfter(Editable editable) { 
  3.         Toast.makeText(MainActivity.this, "改變后內(nèi)容為:"+editable.toString(), Toast.LENGTH_SHORT).show(); 
  4.         System.out.println("改變后---內(nèi)容為:"+editable.toString()); 
  5.     } 
  6.  
  7.     @OnTextChanged(value = R.id.editText, callback = OnTextChanged.Callback.BEFORE_TEXT_CHANGED) 
  8.     void editTextChangeBefore(CharSequence s, int start, int before, int count) { 
  9.         Toast.makeText(MainActivity.this, "編輯內(nèi)容為:"+s+",開始前個數(shù):"+start, Toast.LENGTH_SHORT).show(); 
  10.         System.out.println("改變前---內(nèi)容為:"+s+",開始前個數(shù):"+start+",:"+before+","+count); 
  11.     } 
  12.  
  13.     @OnTextChanged(value = R.id.editText, callback = OnTextChanged.Callback.TEXT_CHANGED) 
  14.     void editTextChange(CharSequence s, int start, int before, int count) { 
  15.         Toast.makeText(MainActivity.this, "編輯內(nèi)容為:"+s+",開始前個數(shù):"+start, Toast.LENGTH_SHORT).show(); 
  16.         System.out.println("未編輯---內(nèi)容為:"+s+",開始前個數(shù):"+start+","+before+","+count); 
  17.     } 

 

運(yùn)行結(jié)果如下: 

6.焦點(diǎn)監(jiān)聽事件

代碼如下:

 
 
 
 
  1. @OnFocusChange(R.id.editTextFocus) 
  2.     void editTextFocus(boolean isl) { 
  3.         if (isl) { 
  4.             Toast.makeText(MainActivity.this, "獲取焦點(diǎn)" + isl, Toast.LENGTH_SHORT).show(); 
  5.         } else { 
  6.             Toast.makeText(MainActivity.this, "失去焦點(diǎn)" + isl, Toast.LENGTH_SHORT).show(); 
  7.         } 
  8.     } 

 

運(yùn)行結(jié)果如下: 

 

 

7. 觸摸監(jiān)聽事件

代碼如下:

 
 
 
 
  1. @OnTouch(R.id.imageView) 
  2.     boolean imageView(MotionEvent event){ 
  3.         System.out.println(event); 
  4.         return false; 
  5.     } 

 

運(yùn)行結(jié)果如下:

 
 
 
 
  1. 04-10 11:47:04.504 32627-32627/cn.hlq.butterknifestudyI/System.out: MotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=189.8265, y[0]=148.42676, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=6743683, downTime=6743683, deviceId=1, source=0x1002 } 

8. item單擊以及長按監(jiān)聽事件

代碼如下:

 
 
 
 
  1. @OnItemClick(R.id.listView) 
  2.   void listItemClick(int position){ 
  3.       Toast.makeText(this,"OnItemClick---點(diǎn)擊了第"+position+"個",Toast.LENGTH_SHORT).show(); 
  4.   } 
  5.  
  6.   @OnItemLongClick(R.id.listView) 
  7.   boolean listItemLongClick(int position) { 
  8.       Toast.makeText(this, "OnItemLongClick---點(diǎn)擊了第" + position + "個", Toast.LENGTH_SHORT).show(); 
  9.       return true; 
  10.   } 

 

運(yùn)行結(jié)果如下: 

 

想必大家通過以上已經(jīng)掌握這套刀法基本使用了,那么上面曾說過,還可以對Adapter進(jìn)行改造,從而節(jié)省開發(fā)過程中一些編碼,那就一塊瞅瞅唄~

刀法二部曲,巧用Adapter

創(chuàng)建一個item_layout作為接下來演示用~

 
 
 
 
  1.  
  2.               android:layout_width="match_parent" 
  3.               android:layout_height="wrap_content" 
  4.               android:orientation="horizontal"> 
  5.  
  6.     
  7.         android:id="@+id/item_username" 
  8.         android:layout_width="0dp" 
  9.         android:layout_height="wrap_content" 
  10.         android:layout_gravity="center_vertical" 
  11.         android:layout_weight="1"/> 
  12.  
  13.     
  14.         android:id="@+id/item_userPwd" 
  15.         android:layout_width="0dp" 
  16.         android:layout_height="wrap_content" 
  17.         android:layout_gravity="center_vertical" 
  18.         android:layout_weight="1"/> 
  19.  
  20.  

 

很簡單,沒什么東西,接下來看adapter~

 
 
 
 
  1. package cn.hlq.butterknifestudy.adapter; 
  2.  
  3. import android.content.Context; 
  4. import android.view.LayoutInflater; 
  5. import android.view.View; 
  6. import android.view.ViewGroup; 
  7. import android.widget.BaseAdapter; 
  8. import android.widget.TextView; 
  9.  
  10. import java.util.ArrayList; 
  11. import java.util.List; 
  12.  
  13. import butterknife.BindView; 
  14. import butterknife.ButterKnife; 
  15. import cn.hlq.butterknifestudy.R; 
  16. import cn.hlq.butterknifestudy.model.Student; 
  17.  
  18. /** 
  19.  * Created by HLQ on 2017/4/11 0011. 
  20.  */ 
  21.  
  22. public class ListViewAdapter extends BaseAdapter { 
  23.  
  24.     private Context context; 
  25.     private List stuList = new ArrayList(); 
  26.  
  27.     public ListViewAdapter(Context context, List stuList) { 
  28.         this.context = context; 
  29.         this.stuList = stuList; 
  30.     } 
  31.  
  32.     @Override 
  33.     public int getCount() { 
  34.         return stuList != null ? stuList.size() : 0; 
  35.     } 
  36.  
  37.     @Override 
  38.     public Object getItem(int position) { 
  39.         return stuList != null ? stuList.get(position) : null; 
  40.     } 
  41.  
  42.     @Override 
  43.     public long getItemId(int position) { 
  44.         return position; 
  45.     } 
  46.  
  47.     @Override 
  48.     public View getView(int position, View convertView, ViewGroup parent) { 
  49.         ViewHolder viewHolder = null; 
  50.         if (viewHolder == null) { 
  51.             convertView = LayoutInflater.from(context).inflate(R.layout.item_listview_show, null); 
  52.             viewHolder = new ViewHolder(convertView); 
  53.             convertView.setTag(viewHolder); 
  54.         } else { 
  55.             viewHolder = (ViewHolder) convertView.getTag(); 
  56.         } 
  57.         Student stu = stuList.get(position); 
  58.         viewHolder.itemUsername.setText(stu.getUserName()); 
  59.         viewHolder.itemUserPwd.setText(stu.getUserPwd()); 
  60.         return convertView; 
  61.     } 
  62.  
  63.     static class ViewHolder { 
  64.         @BindView(R.id.item_username) 
  65.         TextView itemUsername; 
  66.         @BindView(R.id.item_userPwd) 
  67.         TextView itemUserPwd; 
  68.  
  69.         ViewHolder(View view) { 
  70.             ButterKnife.bind(this, view); 
  71.         } 
  72.     } 

 

運(yùn)行結(jié)果為: 

在此告訴大家一個小秘密,你可以直接右鍵layout,在生成注解時,選擇自動創(chuàng)建ViewHolder,如下圖: 

是不是相當(dāng)方便?在此,順便捎帶腳的介紹下,如何使用這把刀玩玩資源內(nèi)容呢?

 
 
 
 
  1. // 初始化指定默認(rèn)值 
  2.     @BindString(R.string.app_test) 
  3.     String titleContent;  
  4.  
  5.     lvTitle.setText(titleContent); 

 

運(yùn)行結(jié)果如下: 

[[194039]]

除以上,刀法中還包含對以下支持,大家有興趣自己了解即可,沒什么難度了 

 

而且官方上也提供了一些基本的使用,如下: 

刀法三部曲BaseActivity封裝,進(jìn)一步簡化代碼

通常我們會封裝一個BaseActivity,里面寫好常用內(nèi)容,之后activity繼承此BaseActivity。同樣我們也可以在此進(jìn)行初始化,避免我們多次初始化,看下面一波代碼~

 
 
 
 
  1. package com.heliquan.butterknife.base; 
  2.  
  3. import android.app.Activity; 
  4. import android.content.Context; 
  5. import android.os.Bundle; 
  6. import android.support.annotation.LayoutRes; 
  7. import android.view.KeyEvent; 
  8. import android.view.View; 
  9. import android.view.ViewGroup; 
  10.  
  11. import butterknife.ButterKnife; 
  12. import butterknife.Unbinder; 
  13.  
  14. /** 
  15.  * created by heliquan at 2017年4月14日 
  16.  */ 
  17. public abstract class BaseActivity extends Activity { 
  18.  
  19.     private Unbinder unbinder; 
  20.  
  21.     @Override 
  22.     protected void onCreate(Bundle savedInstanceState) { 
  23.         super.onCreate(savedInstanceState); 
  24.         // 必須重寫setContentView()的三個方法,不然會出現(xiàn)子類繼承無效,具體原因沒有深入了解 
  25.         setContentView(getContentViewId()); 
  26.         unbinder = ButterKnife.bind(this); 
  27.     } 
  28.  
  29.     @Override 
  30.     public void setContentView(@LayoutRes int layoutResID) { 
  31.         super.setContentView(layoutResID); 
  32.         unbinder = ButterKnife.bind(this); 
  33.     } 
  34.  
  35.     @Override 
  36.     public void setContentView(View view) { 
  37.         super.setContentView(view); 
  38.         unbinder = ButterKnife.bind(this); 
  39.     } 
  40.  
  41.     @Override 
  42.     public 新聞名稱:一篇文章玩轉(zhuǎn)ButterKnife,讓代碼更簡潔
    轉(zhuǎn)載來源:http://www.dlmjj.cn/article/cdoseoi.html