ButterKnife

ButterKnife

Field and method binding for Android views which uses annotation processing to generate boilerplate code for you.

  • Eliminate findViewById calls by using @BindView on fields.
  • Group multiple views in a list or array. Operate on all of them at once with actions, setters, or properties.
  • Eliminate anonymous inner-classes for listeners by annotating methods with @OnClick and others.
  • Eliminate resource lookups by using resource annotations on fields.

這是摘自大神@JakeWharton的Github-ButterKnife上的介紹祝懂〖偶危總所周知,有了這它,媽媽再也不用擔(dān)心我寫無聊的findViewById()和setOnClickListener()等代碼了弦赖,可謂是安卓開發(fā)之必備喳挑。

Remember: A butter knife is like a dagger only infinitely less sharp.


1. 如何使用

  1. Gradle 中引入 ButterKnife 框架:
dependencies {
  compile 'com.jakewharton:butterknife:8.8.1'
  annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}
在library中使用ButterKnife

添加插件到library的buildscript中

buildscript {
  repositories {
    mavenCentral()
   }
  dependencies {
    classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'
  }
}

然后在使用該library的module中,配置以下插件

apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'
  1. 對于Activiry掀抹,由于每次都要在Activity中的onCreate綁定Activity虐拓,所以寫一個BaseActivity完成綁定是一個不錯的選擇,子類繼承即可
    注:ButterKnife.bind(this)傲武;綁定Activity 必須在setContentView之后
public abstract class BaseActivity extends Activity {  
    public abstract int getContentViewId();  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(getContentViewId());  
        ButterKnife.bind(this);  
        initAllMembersView(savedInstanceState);  
    }  

    protected abstract void initAllMembersView(Bundle savedInstanceState);  

    @Override  
    protected void onDestroy() {  
        super.onDestroy();  
        ButterKnife.unbind(this);
    }  
}  
  1. 綁定fragment
public abstract class BaseFragment extends Fragment {  
    public abstract int getContentViewId();  
    protected Context context;  
    protected View mRootView;  

    @Nullable  
    @Override  
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {  
        mRootView =inflater.inflate(getContentViewId(),container,false);  
        ButterKnife.bind(this,mRootView);//綁定framgent  
        this.context = getActivity();  
        initAllMembersView(savedInstanceState);  
        return mRootView;  
    }  

    protected abstract void initAllMembersView(Bundle savedInstanceState);  

    @Override  
    public void onDestroyView() {  
        super.onDestroyView();  
        ButterKnife.unbind(this);//解綁  
    }  
}  
  1. 控件id 注解: @BindView()
public class ButterknifeActivity extends AppCompatActivity {

    @BindView( R.id.button1 )
    public Button button1 ;

    // 注意:button 的修飾類型不能是:private 或者 static 蓉驹。
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_butterknife);
        //綁定activity
        ButterKnife.bind( this ) ;
        button1.setText( "I am a button ");
    }
}
  1. 點擊事件的綁定:不用聲明view,不用setOnClickLisener()就可以綁定點擊事件

5.1 直接綁定一個方法

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

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

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

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

@OnClick(R.id.submit)  
public void sayHi(Button button) {  
  button.setText("Hello!");  
}  

2. ButterKnife原理

ButterKnife的實現(xiàn)并不是基于反射而實現(xiàn)的戒幔,它用了Java Annotation Processing技術(shù)。



APT(Annotation processing tool)是一種處理注釋的工具土童,它對源代碼文件進行檢測找出其中的Annotation诗茎,使用Annotation進行額外的處理。
Annotation處理器在處理Annotation時可以根據(jù)源文件中的Annotation生成額外的源文件和其它的文件(文件具體內(nèi)容由Annotation處理器的編寫者決定)献汗,APT還會編譯生成的源文件和原來的源文件敢订,將它們一起生成class文件。
使用APT主要的目的是簡化開發(fā)者的工作量罢吃,因為APT可以編譯程序源代碼的同時楚午,生成一些附屬文件(比如源文件,類文件尿招,程序發(fā)布描述文件等)矾柜,這些附屬文件的內(nèi)容也都是與源代碼相關(guān)的阱驾,換句話說,使用APT可以代替?zhèn)鹘y(tǒng)的對代碼信息和附屬文件的維護工作怪蔑。

Butterknife用的APT(Annotation Processing Tool)編譯時解析技術(shù)(現(xiàn)在已經(jīng)改成了谷歌的更強大的annotationProcessor里覆,APT已經(jīng)停止更新了)。大概原理就是你聲明的注解的生命周期為CLASS,然后繼承AbstractProcessor類缆瓣。繼承這個類后喧枷,在編譯的時候,編譯器會掃描所有帶有你要處理的注解的類弓坞,然后再調(diào)用AbstractProcessor的process方法隧甚,對注解進行處理,那么我們就可以在處理的時候渡冻,動態(tài)生成綁定事件或者控件的java代碼戚扳,然后在運行的時候,直接調(diào)用方法完成綁定菩帝。

當(dāng)你編譯你的Android工程時咖城,ButterKnife工程中ButterKnifeProcessor類的process()方法會執(zhí)行以下操作:

  • 開始它會掃描Java代碼中所有的ButterKnife注解@Bind、@OnClick呼奢、@OnItemClicked等;
  • 當(dāng)它發(fā)現(xiàn)一個類中含有任何一個注解時宜雀,ButterKnifeProcessor會幫你生成一個Java類,名字類似$$ViewBinder握础,這個新生成的類實現(xiàn)了ViewBinder接口 ;
  • 這個ViewBinder類中包含了所有對應(yīng)的代碼辐董,比如@Bind注解對應(yīng)findViewById(), @OnClick對應(yīng)了view.setOnClickListener()等等 ;
  • 最后當(dāng)Activity啟動ButterKnife.bind(this)執(zhí)行時,ButterKnife會去加載對應(yīng)的ViewBinder類調(diào)用它們的bind()方法禀综。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末简烘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子定枷,更是在濱河造成了極大的恐慌孤澎,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欠窒,死亡現(xiàn)場離奇詭異覆旭,居然都是意外死亡,警方通過查閱死者的電腦和手機岖妄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門型将,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荐虐,你說我怎么就攤上這事七兜。” “怎么了福扬?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵腕铸,是天一觀的道長惜犀。 經(jīng)常有香客問我,道長恬惯,這世上最難降的妖魔是什么向拆? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任亚茬,我火速辦了婚禮酪耳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘刹缝。我一直安慰自己碗暗,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布梢夯。 她就那樣靜靜地躺著言疗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪颂砸。 梳的紋絲不亂的頭發(fā)上噪奄,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機與錄音人乓,去河邊找鬼勤篮。 笑死,一個胖子當(dāng)著我的面吹牛色罚,可吹牛的內(nèi)容都是我干的碰缔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼戳护,長吁一口氣:“原來是場噩夢啊……” “哼金抡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起腌且,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤梗肝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后铺董,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巫击,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年柄粹,在試婚紗的時候發(fā)現(xiàn)自己被綠了喘鸟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡驻右,死狀恐怖什黑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情堪夭,我是刑警寧澤愕把,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布拣凹,位于F島的核電站,受9級特大地震影響恨豁,放射性物質(zhì)發(fā)生泄漏嚣镜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一橘蜜、第九天 我趴在偏房一處隱蔽的房頂上張望菊匿。 院中可真熱鬧,春花似錦计福、人聲如沸跌捆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽佩厚。三九已至,卻和暖如春说订,著一層夾襖步出監(jiān)牢的瞬間抄瓦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工陶冷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钙姊,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓埃叭,卻偏偏與公主長得像摸恍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赤屋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 俗話說的好“不想偷懶的程序員立镶,不是好程序員”,我們在日常開發(fā)android的過程中类早,在前端activity或者fr...
    蛋西閱讀 4,966評論 0 14
  • 1.什么是注解2.注解的分類3.編譯時注解的原理4.APT5.創(chuàng)建項目及依賴6.編碼實現(xiàn)7.總結(jié) 我們首先了解一下...
    慕涵盛華閱讀 653評論 0 6
  • 0X0 前言 做過Android開發(fā)的猿類很多都知道ButterKnife這么個東西媚媒。這個庫可以大大的簡化我們的代...
    knightingal閱讀 759評論 1 10
  • 源碼剖析——ButterKnife的工作流程 butterknife是一個android視圖快速注入庫,它通過給v...
    spiritTalk閱讀 3,308評論 1 11
  • 誰可去到云里 搖醒風(fēng)鈴 讓它把北風(fēng)緊一緊 裝進籠里 還她一份溫情 去年的冬天 也是如此 春光明媚 夜晚更是清新 夢...
    蓮籽閱讀 247評論 0 3