溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ButterKnife的原理及如何使用

發(fā)布時(shí)間:2022-01-12 11:48:56 來源:億速云 閱讀:163 作者:柒染 欄目:移動(dòng)開發(fā)

ButterKnife的原理及如何使用,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。

前言

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

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

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

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

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

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

ButterKnife 初識(shí)

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

ButterKnife的原理及如何使用

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

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

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

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

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

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

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

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

ButterKnife 優(yōu)勢

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

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

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

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

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

ButterKnife 使用場景

  • View(視圖)綁定:例如初始化控件;

  • 資源綁定:例如color,string等;

  • 非Activity綁定:這里值得是當(dāng)時(shí)用 fragment 的時(shí)候;

  • View List 綁定: Adapter 中 ViewHolder,具體使用會(huì)在下方講解;

  • Listener 綁定:這個(gè)就好理解了,也就是平時(shí)控件所需監(jiān)聽事件。

ButterKnife 語法

1. activity fragment 綁定與 fragment解綁

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

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

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

public class FancyFragment extends Fragment {   @BindView(R.id.button1) Button button1;   @BindView(R.id.button2) Button button2;   private Unbinder unbinder;    @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {     View view = inflater.inflate(R.layout.fancy_fragment, container, false);     // 綁定     unbinder = ButterKnife.bind(this, view);     // TODO Use fields...     return view;   }    @Override public void onDestroyView() {     super.onDestroyView();     // 解綁     unbinder.unbind();   } }

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

2.單擊事件

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

ButterKnife的原理及如何使用

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

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

// 寫法1    @OnClick(控件ID)    void 方法名() {        //業(yè)務(wù)邏輯操作    }        // 寫法2    @OnClick(控件ID)    void 方法名(控件類型) {        //業(yè)務(wù)邏輯操作    }        // 寫法3    @OnClick(控件ID)    void 方法名(View view) {        //業(yè)務(wù)邏輯操作    }

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

ButterKnife的原理及如何使用

3.長按事件

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

ButterKnife的原理及如何使用

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

// 方法1    boolean 方法名(){        // 業(yè)務(wù)邏輯操作        return false;    }        // 方法2    boolean 方法名(控件類型){        // 業(yè)務(wù)邏輯操作        return false;    }     // 方法3    boolean 方法名(View view){        // 業(yè)務(wù)邏輯操作        return false;    }

4.Checked改變事件

老規(guī)矩:

ButterKnife的原理及如何使用

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

// 寫法1     @OnCheckedChanged(控件ID)     void radioButtonCheckChange(boolean isl) {         // 業(yè)務(wù)邏輯     }          // 寫法2     @OnCheckedChanged(控件ID)     void radioButtonCheckChange(控件類型,boolean isl) {         // 業(yè)務(wù)邏輯     }

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

老規(guī)矩:

ButterKnife的原理及如何使用

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

// 寫法1     @OnEditorAction(控件ID)     boolean 方法名() {         // 業(yè)務(wù)邏輯操作         return false;     }      // 寫法2     // code:狀態(tài)碼     @OnEditorAction(控件ID)     boolean EditTextAction(int code) {         // 業(yè)務(wù)邏輯操作         return false;     }      // 寫法3     // KeyEvent     @OnEditorAction(控件ID)     boolean EditTextAction(KeyEvent keyEvent) {         // 業(yè)務(wù)邏輯操作         return false;     }      // 寫法4     @OnEditorAction(控件ID)     boolean EditTextAction(int code, KeyEvent keyEvent) {         // 業(yè)務(wù)邏輯操作         return false;     }      // 寫法5     @OnEditorAction(控件ID)     boolean EditTextAction(TextView textView,int code, KeyEvent keyEvent) {         // 業(yè)務(wù)邏輯操作         return false;     }

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

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

@Target(METHOD) @Retention(CLASS) @ListenerClass(     targetType = "android.widget.TextView",     setter = "addTextChangedListener",     remover = "removeTextChangedListener",     type = "android.text.TextWatcher",   --->   這里同樣對(duì)之前的TextWatcher做了相關(guān)處理 ggg     callbacks = OnTextChanged.Callback.class   --->   自定義枚舉,通過枚舉類型標(biāo)識(shí)當(dāng)前操作 666 ) public @interface OnTextChanged {   /** View IDs to which the method will be bound. */   @IdRes int[] value() default { View.NO_ID };   --->   需要傳入ID    /** Listener callback to which the method will be bound. */   Callback callback() default Callback.TEXT_CHANGED;  --->  未改變狀態(tài)    /** {@link TextWatcher} callback methods. */   enum Callback {  --->  枚舉中分為三種類似 未改變 改變前 改變后     /** {@link TextWatcher#onTextChanged(CharSequence, int, int, int)} */     @ListenerMethod(         name = "onTextChanged",  --->  當(dāng)前標(biāo)識(shí)為 未改變         parameters = {             "java.lang.CharSequence",  --->  用戶輸入字符             "int", --->  改變前個(gè)數(shù)             "int", --->  測試時(shí),返回0,沒整明白代表什么意思             "int"  --->  根據(jù)打印結(jié)果,猜測這個(gè)應(yīng)該是每次增加內(nèi)容個(gè)數(shù)         }     )     TEXT_CHANGED,      /** {@link TextWatcher#beforeTextChanged(CharSequence, int, int, int)} */     @ListenerMethod(         name = "beforeTextChanged",  --->  當(dāng)前標(biāo)識(shí)為 改變前         parameters = {             "java.lang.CharSequence",  --->  用戶輸入字符             "int", --->  改變前個(gè)數(shù)             "int",             "int"         }     )     BEFORE_TEXT_CHANGED,      /** {@link TextWatcher#afterTextChanged(android.text.Editable)} */     @ListenerMethod(         name = "afterTextChanged",  --->  當(dāng)前標(biāo)識(shí)為 改變后         parameters = "android.text.Editable"  --->  用戶輸入字符     )     AFTER_TEXT_CHANGED, --->  我們關(guān)注的重點(diǎn)在此,每次只需要監(jiān)聽這個(gè),去做相關(guān)處理即可   }

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

// 內(nèi)容改變后監(jiān)聽     // Editable editable:用戶輸入字符     @OnTextChanged(value = 控件ID, callback = 監(jiān)聽類型,改變后取值為:OnTextChanged.Callback.AFTER_TEXT_CHANGED)     void editTextChangeAfter(Editable editable) {         // 業(yè)務(wù)邏輯     }      // 內(nèi)容改變前監(jiān)聽     @OnTextChanged(value = 控件ID, callback = 監(jiān)聽類型,改變前取值為:OnTextChanged.Callback.BEFORE_TEXT_CHANGED)     void editTextChangeBefore(CharSequence s, int start) {         // 業(yè)務(wù)邏輯     }      // 內(nèi)容未發(fā)生改變監(jiān)聽     @OnTextChanged(value = 控件ID, callback = 監(jiān)聽類型,取值為:OnTextChanged.Callback.TEXT_CHANGED)     void editTextChange(CharSequence s, int start) {         // 業(yè)務(wù)邏輯     }

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

老規(guī)矩:

ButterKnife的原理及如何使用

由此可見,如下:

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

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

老規(guī)矩:

ButterKnife的原理及如何使用

寫法如下:

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

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

老規(guī)矩:

ButterKnife的原理及如何使用 

so...

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

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

老規(guī)矩:

ButterKnife的原理及如何使用

so...

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

ButterKnife 使用注意

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

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

3.屬性布局不能用private or static 修飾,否則會(huì)報(bào)錯(cuò);

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

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

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

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

第一步:Android Studio集成ButterKnife插件

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

ButterKnife的原理及如何使用

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

ButterKnife的原理及如何使用

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

第二步:配置ButterKnife

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

ButterKnife的原理及如何使用 

ButterKnife的原理及如何使用

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

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

ButterKnife的原理及如何使用

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

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

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

ButterKnife的原理及如何使用

 

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

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

代碼如下:

@OnClick(R.id.text)     void textClick() {         Toast.makeText(MainActivity.this, "TextView的單擊事件觸發(fā)。。。(無參-默認(rèn))", Toast.LENGTH_SHORT).show();     }      @OnClick(R.id.text)     void textClick(TextView textView){         Toast.makeText(MainActivity.this, "TextView的單擊事件觸發(fā)。。。(TextView)", Toast.LENGTH_SHORT).show();     }      @OnClick(R.id.text)     void textClick(View view){         Toast.makeText(MainActivity.this, "TextView的單擊事件觸發(fā)。。。(View)", Toast.LENGTH_SHORT).show();     }

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

ButterKnife的原理及如何使用

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

代碼如下:

@OnLongClick(R.id.button)     boolean buttonLongClick(){         Toast.makeText(MainActivity.this, "Button的長按事件觸發(fā)。。。(無參-默認(rèn))", Toast.LENGTH_SHORT).show();         return false;     }  //    @OnLongClick(R.id.button) //    boolean buttonLongClick(Button button){ //        Toast.makeText(MainActivity.this, "Button的長按事件觸發(fā)。。。(TextView)", Toast.LENGTH_SHORT).show(); //        return false; //    }  //    @OnLongClick(R.id.button) //    boolean buttonLongClick(View view){ //        Toast.makeText(MainActivity.this, "Button的長按事件觸發(fā)。。。(View)", Toast.LENGTH_SHORT).show(); //        return false; //    }

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

ButterKnife的原理及如何使用

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

Multiple listener methods with return value specified for ID:2131165193

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

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

代碼如下:

@OnCheckedChanged(R.id.checkBox)     void radioButtonCheckChange(boolean isl) {         Toast.makeText(MainActivity.this, "CheckBox。。。(無參)" + isl, Toast.LENGTH_SHORT).show();     }      @OnCheckedChanged(R.id.checkBox)     void radioButtonCheckChange(CheckBox checkBox,boolean isl) {         Toast.makeText(MainActivity.this, "CheckBox。。。(CheckBox)" + isl, Toast.LENGTH_SHORT).show();     }

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

ButterKnife的原理及如何使用

 

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

代碼如下:

//    @OnEditorAction(R.id.tv_editor_action) //    boolean EditTextAction() { //        Toast.makeText(MainActivity.this, " 點(diǎn)擊---通往天堂 無參", Toast.LENGTH_SHORT).show(); //        return false; //    }  //    @OnEditorAction(R.id.tv_editor_action) //    boolean EditTextAction(int code) { //        Toast.makeText(MainActivity.this, " 點(diǎn)擊---通往天堂 code:"+code, Toast.LENGTH_SHORT).show(); //        return false; //    }  //    @OnEditorAction(R.id.tv_editor_action) //    boolean EditTextAction(KeyEvent keyEvent) { //        Toast.makeText(MainActivity.this, "點(diǎn)擊---通往天堂 KeyEvent:"+keyEvent, Toast.LENGTH_SHORT).show(); //        return false; //    }  //    @OnEditorAction(R.id.tv_editor_action) //    boolean EditTextAction(int code, KeyEvent keyEvent) { //        Toast.makeText(MainActivity.this, "點(diǎn)擊---通往天堂 code:"+code+" KeyEvent:"+keyEvent, Toast.LENGTH_SHORT).show(); //        return false; //    }      @OnEditorAction(R.id.tv_editor_action)     boolean EditTextAction(TextView textView,int code, KeyEvent keyEvent) {         Toast.makeText(MainActivity.this, textView.getText().toString()+" 點(diǎn)擊---通往天堂 code:"+code+" KeyEvent:"+keyEvent, Toast.LENGTH_SHORT).show();         return false;     }

運(yùn)行效果下:

ButterKnife的原理及如何使用

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

代碼如下:

@OnTextChanged(value = R.id.editText, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)     void editTextChangeAfter(Editable editable) {         Toast.makeText(MainActivity.this, "改變后內(nèi)容為:"+editable.toString(), Toast.LENGTH_SHORT).show();         System.out.println("改變后---內(nèi)容為:"+editable.toString());     }      @OnTextChanged(value = R.id.editText, callback = OnTextChanged.Callback.BEFORE_TEXT_CHANGED)     void editTextChangeBefore(CharSequence s, int start, int before, int count) {         Toast.makeText(MainActivity.this, "編輯內(nèi)容為:"+s+",開始前個(gè)數(shù):"+start, Toast.LENGTH_SHORT).show();         System.out.println("改變前---內(nèi)容為:"+s+",開始前個(gè)數(shù):"+start+",:"+before+","+count);     }      @OnTextChanged(value = R.id.editText, callback = OnTextChanged.Callback.TEXT_CHANGED)     void editTextChange(CharSequence s, int start, int before, int count) {         Toast.makeText(MainActivity.this, "編輯內(nèi)容為:"+s+",開始前個(gè)數(shù):"+start, Toast.LENGTH_SHORT).show();         System.out.println("未編輯---內(nèi)容為:"+s+",開始前個(gè)數(shù):"+start+","+before+","+count);     }

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

ButterKnife的原理及如何使用

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

代碼如下:

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

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

ButterKnife的原理及如何使用

 

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

代碼如下:

@OnTouch(R.id.imageView)     boolean imageView(MotionEvent event){         System.out.println(event);         return false;     }

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

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)聽事件

代碼如下:

@OnItemClick(R.id.listView)   void listItemClick(int position){       Toast.makeText(this,"OnItemClick---點(diǎn)擊了第"+position+"個(gè)",Toast.LENGTH_SHORT).show();   }    @OnItemLongClick(R.id.listView)   boolean listItemLongClick(int position) {       Toast.makeText(this, "OnItemLongClick---點(diǎn)擊了第" + position + "個(gè)", Toast.LENGTH_SHORT).show();       return true;   }

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

ButterKnife的原理及如何使用

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

刀法二部曲,巧用Adapter

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

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"               android:layout_width="match_parent"               android:layout_height="wrap_content"               android:orientation="horizontal">      <TextView         android:id="@+id/item_username"         android:layout_width="0dp"         android:layout_height="wrap_content"         android:layout_gravity="center_vertical"         android:layout_weight="1"/>      <TextView         android:id="@+id/item_userPwd"         android:layout_width="0dp"         android:layout_height="wrap_content"         android:layout_gravity="center_vertical"         android:layout_weight="1"/>  </LinearLayout>

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

package cn.hlq.butterknifestudy.adapter;  import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView;  import java.util.ArrayList; import java.util.List;  import butterknife.BindView; import butterknife.ButterKnife; import cn.hlq.butterknifestudy.R; import cn.hlq.butterknifestudy.model.Student;  /**  * Created by HLQ on 2017/4/11 0011.  */  public class ListViewAdapter extends BaseAdapter {      private Context context;     private List<Student> stuList = new ArrayList<Student>();      public ListViewAdapter(Context context, List<Student> stuList) {         this.context = context;         this.stuList = stuList;     }      @Override     public int getCount() {         return stuList != null ? stuList.size() : 0;     }      @Override     public Object getItem(int position) {         return stuList != null ? stuList.get(position) : null;     }      @Override     public long getItemId(int position) {         return position;     }      @Override     public View getView(int position, View convertView, ViewGroup parent) {         ViewHolder viewHolder = null;         if (viewHolder == null) {             convertView = LayoutInflater.from(context).inflate(R.layout.item_listview_show, null);             viewHolder = new ViewHolder(convertView);             convertView.setTag(viewHolder);         } else {             viewHolder = (ViewHolder) convertView.getTag();         }         Student stu = stuList.get(position);         viewHolder.itemUsername.setText(stu.getUserName());         viewHolder.itemUserPwd.setText(stu.getUserPwd());         return convertView;     }      static class ViewHolder {         @BindView(R.id.item_username)         TextView itemUsername;         @BindView(R.id.item_userPwd)         TextView itemUserPwd;          ViewHolder(View view) {             ButterKnife.bind(this, view);         }     } }

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

ButterKnife的原理及如何使用

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

ButterKnife的原理及如何使用

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

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

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

ButterKnife的原理及如何使用

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

ButterKnife的原理及如何使用 

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

ButterKnife的原理及如何使用

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

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

package com.heliquan.butterknife.base;  import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.support.annotation.LayoutRes; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup;  import butterknife.ButterKnife; import butterknife.Unbinder;  /**  * created by heliquan at 2017年4月14日  */ public abstract class BaseActivity extends Activity {      private Unbinder unbinder;      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         // 必須重寫setContentView()的三個(gè)方法,不然會(huì)出現(xiàn)子類繼承無效,具體原因沒有深入了解         setContentView(getContentViewId());         unbinder = ButterKnife.bind(this);     }      @Override     public void setContentView(@LayoutRes int layoutResID) {         super.setContentView(layoutResID);         unbinder = ButterKnife.bind(this);     }      @Override     public void setContentView(View view) {         super.setContentView(view);         unbinder = ButterKnife.bind(this);     }      @Override     public void setContentView(View view, ViewGroup.LayoutParams params) {         super.setContentView(view, params);         unbinder = ButterKnife.bind(this);     }      /**      * 獲取內(nèi)容id      */     protected abstract int getContentViewId();      /**      * 初始化View      */     protected abstract void initView();      @Override     protected void onDestroy() {         super.onDestroy();         unbinder.unbind();     }      /**      * 根據(jù)id返回資源內(nèi)容      *      * @param context      * @param strId      * @return      */     protected String getStrResource(Activity activity, int strId) {         return activity.getResources().getString(strId);     }      /**      * 監(jiān)聽返回按鈕,點(diǎn)擊返回finish當(dāng)前頁面      *      * @param keyCode      * @param event      * @return      */     @Override     public boolean onKeyDown(int keyCode, KeyEvent event) {         if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {             finish();             return true;         }         return super.onKeyDown(keyCode, event);     } }

關(guān)于ButterKnife的原理及如何使用問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI