ButterKnife使用詳解

寫在前面:該文檔使用7.0版本援雇,8.0版本方法名有所改動(dòng)曙旭,建議看官方文檔钻趋,整體業(yè)務(wù)邏輯和原理沒什么變動(dòng)蛮位,官網(wǎng)

Android編程過程中,我們會(huì)寫大量的布局和點(diǎn)擊事件萄焦,像初始view鹦蠕、設(shè)置view監(jiān)聽這樣簡(jiǎn)單而重復(fù)的操作讓人覺得麻煩類钟病,所以可以采用注解的方式去實(shí)現(xiàn),而ButterKnife則是注解中相對(duì)簡(jiǎn)單易懂的很不錯(cuò)的開源框架辖所,而網(wǎng)上的文檔和例子都過時(shí)了,7.0之后的版本改動(dòng)很大,之前的注解都不能用了您觉,所以借鑒官方文檔總結(jié)了一下,接下來就介紹一下如何使用在孝。基本參照官方文檔仔燕,加上自己的心得五辽。

ButterKnife 優(yōu)勢(shì):

1.強(qiáng)大的View綁定和Click事件處理功能俄周,簡(jiǎn)化代碼,提升開發(fā)效率

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

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

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

使用心得:

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

2.Fragment ButterKnife.bind(this, mRootView);

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

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

官網(wǎng)http://jakewharton.github.io/butterknife/

使用步驟:

一.導(dǎo)入ButterKnife jar包:

1)如果你是Eclipse,可以去官網(wǎng)下載jar包

2)如果你是AndroidStudio可以直接 File->Project Structure->Dependencies->Library dependency 搜索butterknife即可,第一個(gè)就是

3)當(dāng)然也可以用maven和gradle配置

[html]view plaincopy

MAVEN

com.jakewharton

butterknife

(insert?latest?version)

GRADLE

compile?'com.jakewharton:butterknife:(insert?latest?version)'

Be?sure?to?suppress?this?lint?warning?in?your?build.gradle.(關(guān)閉)

lintOptions?{

disable?'InvalidPackage'

}

注意如果在Library 項(xiàng)目中使用要按如下步驟(github中有具體描述)否則無法找到view:

注:官網(wǎng)github也有對(duì)應(yīng)的引用步驟。

二.常見使用方法:

1)由于每次都要在Activity中的onCreate綁定Activity暂吉,所以個(gè)人建議寫一個(gè)BaseActivity完成綁定阎肝,子類繼承即可

注:ButterKnife.bind(this)嫉父;綁定Activity 必須在setContentView之后:

實(shí)現(xiàn)如下(FragmentActivity 實(shí)現(xiàn)一樣):

[java]view plaincopy

publicabstractclassBaseActivityextendsActivity?{

publicabstractintgetContentViewId();

@Override

protectedvoidonCreate(Bundle?savedInstanceState)?{

super.onCreate(savedInstanceState);

setContentView(getContentViewId());

ButterKnife.bind(this);

initAllMembersView(savedInstanceState);

}

protectedabstractvoidinitAllMembersView(Bundle?savedInstanceState);

@Override

protectedvoidonDestroy()?{

super.onDestroy();

ButterKnife.unbind(this);//解除綁定,官方文檔只對(duì)fragment做了解綁

}

}

2)綁定fragment

[java]view plaincopy

publicabstractclassBaseFragmentextendsFragment?{

publicabstractintgetContentViewId();

protectedContext?context;

protectedView?mRootView;

@Nullable

@Override

publicView?onCreateView(LayoutInflater?inflater,@NullableViewGroup?container,@NullableBundle?savedInstanceState)?{

mRootView?=inflater.inflate(getContentViewId(),container,false);

ButterKnife.bind(this,mRootView);//綁定framgent

this.context?=?getActivity();

initAllMembersView(savedInstanceState);

returnmRootView;

}

protectedabstractvoidinitAllMembersView(Bundle?savedInstanceState);

@Override

publicvoidonDestroyView()?{

super.onDestroyView();

ButterKnife.unbind(this);//解綁

}

}

3)綁定view

[java]view plaincopy

@Bind(R.id.hello_world)

TextView?mHelloWorldTextView;

@Bind(R.id.app_name)

TextView?mAppNameTextView;//view

4)綁定資源

[java]view plaincopy

@BindString(R.string.app_name)

String?appName;//sting

@BindColor(R.color.red)

inttextColor;//顏色

@BindDrawable(R.mipmap.ic_launcher)

Drawable?drawable;//drawble

@Bind(R.id.imageview)

ImageView?mImageView;

@Bind(R.id.checkbox)

CheckBox?mCheckBox;

@BindDrawable(R.drawable.selector_image)

Drawable?selector;

5)Adapter ViewHolder 綁定

[java]view plaincopy

publicclassTestAdapterextendsBaseAdapter?{

privateList?list;

privateContext?context;

publicTestAdapter(Context?context,?List?list)?{

this.list?=?list;

this.context?=?context;

}

@Override

publicintgetCount()?{

returnlist==null?0:?list.size();

}

@Override

publicObject?getItem(intposition)?{

returnlist.get(position);

}

@Override

publiclonggetItemId(intposition)?{

returnposition;

}

@Override

publicView?getView(intposition,?View?convertView,?ViewGroup?parent)?{

ViewHolder?holder;

if(convertView?==null)?{

convertView?=?LayoutInflater.from(context).inflate(R.layout.layout_list_item,null);

holder?=newViewHolder(convertView);

convertView.setTag(holder);

}else{

holder?=?(ViewHolder)?convertView.getTag();

}

holder.textview.setText("item====="+?position);

returnconvertView;

}

staticclassViewHolder?{

@Bind(R.id.hello_world)

TextView?textview;

publicViewHolder(View?view)?{

ButterKnife.bind(this,?view);

}

}

}

6)點(diǎn)擊事件的綁定:不用聲明view,不用setOnClickLisener()就可以綁定點(diǎn)擊事件

a.直接綁定一個(gè)方法

[java]view plaincopy

@OnClick(R.id.submit)

publicvoidsubmit(View?view)?{

//?TODO?submit?data?to?server...

}

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

[java]view plaincopy

@OnClick(R.id.submit)

publicvoidsubmit()?{

//?TODO?submit?data?to?server...

}

c.定義一個(gè)特定類型,它將自動(dòng)被轉(zhuǎn)換

[java]view plaincopy

@OnClick(R.id.submit)

publicvoidsayHi(Button?button)?{

button.setText("Hello!");

}

d.多個(gè)view統(tǒng)一處理同一個(gè)點(diǎn)擊事件蹦玫,很方便,避免抽方法重復(fù)調(diào)用的麻煩

[java]view plaincopy

@OnClick({?R.id.door1,?R.id.door2,?R.id.door3?})

publicvoidpickDoor(DoorView?door)?{

if(door.hasPrizeBehind())?{

Toast.makeText(this,"You?win!",?LENGTH_SHORT).show();

}else{

Toast.makeText(this,"Try?again",?LENGTH_SHORT).show();

}

}

e.自定義view可以綁定自己的監(jiān)聽,不指定id

[java]view plaincopy

publicclassFancyButtonextendsButton?{

@OnClick

publicvoidonClick()?{

//?TODO?do?something!

}

}

f.給EditText加addTextChangedListener(即添加多回調(diào)方法的監(jiān)聽的使用方法)绢馍,利用指定回調(diào)舰涌,實(shí)現(xiàn)想回調(diào)的方法即可,哪個(gè)注解不會(huì)用點(diǎn)進(jìn)去看下源碼上的注釋就會(huì)用了

[java]view plaincopy

@OnTextChanged(value?=?R.id.mobileEditText,?callback?=?OnTextChanged.Callback.BEFORE_TEXT_CHANGED)

voidbeforeTextChanged(CharSequence?s,intstart,intcount,intafter)?{

}

@OnTextChanged(value?=?R.id.mobileEditText,?callback?=?OnTextChanged.Callback.TEXT_CHANGED)

voidonTextChanged(CharSequence?s,intstart,intbefore,intcount)?{

}

@OnTextChanged(value?=?R.id.mobileEditText,?callback?=?OnTextChanged.Callback.AFTER_TEXT_CHANGED)

voidafterTextChanged(Editable?s)?{

}

7)對(duì)一組View進(jìn)行統(tǒng)一操作

a.裝入一個(gè)list

[java]view plaincopy

@Bind({?R.id.first_name,?R.id.middle_name,?R.id.last_name?})

List?nameViews;

b.設(shè)置統(tǒng)一處理

[java]view plaincopy

staticfinalButterKnife.Action?DISABLE?=newButterKnife.Action()?{

@Overridepublicvoidapply(View?view,intindex)?{

view.setEnabled(false);

}

};

staticfinalButterKnife.Setter?ENABLED?=newButterKnife.Setter()?{

@Overridepublicvoidset(View?view,?Boolean?value,intindex)?{

view.setEnabled(value);

}

};

c.統(tǒng)一操作處理宇弛,例如設(shè)置是否可點(diǎn)彻况,屬性等

[java]view plaincopy

ButterKnife.apply(nameViews,?DISABLE);

ButterKnife.apply(nameViews,?ENABLED,false);

8)可選綁定:默認(rèn)情況下纽甘,“綁定”和“監(jiān)聽”綁定都是必需的。如果不能找到目標(biāo)視圖泽裳,則將拋出異常胸囱。所以做空處理

[java]view plaincopy

@Nullable@Bind(R.id.might_not_be_there)?TextView?mightNotBeThere;

@Nullable@OnClick(R.id.maybe_missing)voidonMaybeMissingClicked()?{

//?TODO?...

}

三、代碼混淆

[java]view plaincopy

-keepclassbutterknife.**?{?*;?}

-dontwarn?butterknife.internal.**

-keepclass**$$ViewBinder?{?*;?}

-keepclasseswithmembernamesclass*?{

@butterknife.*?;

}

-keepclasseswithmembernamesclass*?{

@butterknife.*?;

}

四谤职、Zelezny插件的使用

在AndroidStudio->File->Settings->Plugins->搜索Zelezny下載添加就行 允蜈,可以快速生成對(duì)應(yīng)組件的實(shí)例對(duì)象蒿柳,不用手動(dòng)寫。使用時(shí)妓蛮,在要導(dǎo)入注解的Activity 或 Fragment 或 ViewHolder的layout資源代碼上圾叼,右鍵——>Generate——Generate ButterKnife Injections,然后就出現(xiàn)如圖的選擇框构挤。(此動(dòng)態(tài)圖來自官網(wǎng))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末儿倒,一起剝皮案震驚了整個(gè)濱河市呜笑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叫胁,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豺型,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡肴焊,警方通過查閱死者的電腦和手機(jī)届宠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門谓厘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人聂宾,你說我怎么就攤上這事。” “怎么了梯刚?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵锥腻,是天一觀的道長(zhǎng)销睁。 經(jīng)常有香客問我,道長(zhǎng)演顾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任宪卿,我火速辦了婚禮,結(jié)果婚禮上休溶,老公的妹妹穿的比我還像新娘禾进。我一直安慰自己,他們只是感情好宠纯,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布廉白。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪聋溜。 梳的紋絲不亂的頭發(fā)上买雾,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天型雳,我揣著相機(jī)與錄音沿量,去河邊找鬼钓简。 笑死损话,一個(gè)胖子當(dāng)著我的面吹牛光涂,可吹牛的內(nèi)容都是我干的忘闻。 我是一名探鬼主播交播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼隧土,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼辐脖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瑟由,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亮蛔,沒想到半個(gè)月后辣吃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體偷仿,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宗苍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年丽啡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片天梧。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡后豫,死狀恐怖早龟,靈堂內(nèi)的尸體忽然破棺而出猜丹,到底是詐尸還是另有隱情藏杖,我是刑警寧澤祥楣,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布兽间,位于F島的核電站帜羊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一吼砂、第九天 我趴在偏房一處隱蔽的房頂上張望拇惋。 院中可真熱鬧胡嘿,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春缭嫡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纵诞。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工纸俭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窒悔,地道東北人放妈。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓托启,卻偏偏與公主長(zhǎng)得像疗绣,于是被迫代替她去往敵國(guó)和親塔逃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子格粪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • 版權(quán)聲明 原創(chuàng)作者:谷哥的小弟博客地址:http://blog.csdn.net/lfdfhl 參考資料 http...
    谷哥的小弟閱讀 460評(píng)論 0 0
  • 注解庫(kù), JakeWharton大神的杰作 Note:文章基于8.5.1版本,不同的版本之間用法可能會(huì)稍有差異,實(shí)...
    施斌閱讀 7,098評(píng)論 1 3
  • http://blog.csdn.net/itjianghuxiaoxiong/article/details/5...
    51ac3305fd46閱讀 529評(píng)論 0 0
  • 項(xiàng)目地址 GitHub地址:https://github.com/JakeWharton/butterknife ...
    劉滌生閱讀 3,114評(píng)論 1 1
  • 人生的最高境界是佛為心芒率,道為骨,儒為表,大度看世界观挎。技在手显熏,能在身,思在腦,從容過生活。
    彗星流星都是星閱讀 244評(píng)論 0 0