ButterKnife是一個(gè)注解框架移斩,一般在綁定View的時(shí)候使用痪欲。不得不說(shuō)劳秋,這個(gè)框架"有毒",用了就上癮胖齐,連寫(xiě)個(gè)Demo都要去導(dǎo)這個(gè)庫(kù)玻淑。大多數(shù)同學(xué)都用過(guò)ButterKnife,可能好多人都停留在findViewById()上呀伙。我想說(shuō)补履,確實(shí)不只是有findViewById()這個(gè)功能。不得不承認(rèn)剿另,在這之前箫锤,我對(duì)ButterKnife的使用贬蛙,也只停留在綁定視圖和點(diǎn)擊事件上。
AndroidAnnotation(AA)與ButterKnife的比較
- 首先從功能上來(lái)說(shuō)谚攒,AA提供的注解數(shù)量遠(yuǎn)多于ButterKnife阳准,功能也是無(wú)所不包(View的綁定,線程馏臭,監(jiān)聽(tīng)野蝇,動(dòng)畫(huà),balabala...)而B(niǎo)utterKnife僅僅提供針對(duì)View的注解括儒。
- 其次從兩類(lèi)框架的實(shí)現(xiàn)流程上來(lái)說(shuō)绕沈,AA在一開(kāi)始就已經(jīng)生成了新的代碼XXXActivity_,后續(xù)的執(zhí)行都是依賴于新的代碼帮寻。生成的方法和代碼量較多乍狐。ButterKnife在編譯時(shí)也是會(huì)生成新的中間工具類(lèi),代碼量相對(duì)于AA來(lái)說(shuō)略少固逗,但是新增了類(lèi)文件浅蚪。并且,在運(yùn)行時(shí)抒蚜,需要通過(guò)一點(diǎn)點(diǎn)反射的技術(shù)來(lái)實(shí)現(xiàn)整體的邏輯掘鄙。
- 第三,從上手成都上來(lái)說(shuō)嗡髓,AA的前期工作略麻煩一些操漠,并且后期需要手動(dòng)修改類(lèi)名(XXX的后面加上下劃線)ButterKnife則需要在類(lèi)中添加ButterKnife.Bind方法來(lái)使用綁定功能。AA稍微麻煩一丟丟饿这。
使用方法:
常用的幾個(gè)注解
Butterknife支持Activity浊伙,F(xiàn)ragment,View长捧,Dialog嚣鄙,ViewHolder類(lèi)內(nèi)部的View綁定
@Bind
TextView mTextView//最常用的注解,用來(lái)綁定View串结,避免findViewById哑子,也可以用在ViewHolder里,必須是public
@Bind({ R.id.first_name, R.id.middle_name, R.id.last_name })
List<EditText> nameViews//綁定多個(gè)view肌割,只能用List不能用ArrayList
@OnClick(R.id.submit)
public void submit(View view) {...}//綁定點(diǎn)擊事件卧蜓,支持多個(gè)id綁定同一個(gè)方法
@OnItemSelected(R.id.list_view)
void onItemSelected(int position) {...}//selected事件
@OnItemClick(R.id.example_list)
void onItemClick(int position) {...}//itemClick事件
@OnFocusChange(R.id.example)
void onFocusChanged(boolean focused){...}//焦點(diǎn)改變監(jiān)聽(tīng)
@OnItemLongClick(R.id.example_list)
boolean onItemLongClick(int position){...}//長(zhǎng)按監(jiān)聽(tīng)
@OnPageChange(R.id.example_pager)
void onPageSelected(int position){...}//Viewpager切換監(jiān)聽(tīng)
@OnTextChanged(R.id.example)
void onTextChanged(CharSequence text)//內(nèi)容改變監(jiān)聽(tīng)
@BindInt//用來(lái)綁定Integer類(lèi)型的resource ID
@BindString//用來(lái)綁定string.xml里的字符串
@BindDrawable//用來(lái)綁定圖片
@BindColor//用來(lái)綁定顏色
@BindDimen//用來(lái)綁定dimens
幾點(diǎn)有關(guān)ButterKnife的提示,使用時(shí)避免踩坑把敞。
- Activity: ButterKnife.bind(this);
- 必須在setContentView();之后弥奸,且父類(lèi)bind綁定后,子類(lèi)不需要再bind
- Fragment :ButterKnife.bind(this, mRootView);
- 屬性布局不能用private 或static 修飾奋早,否則會(huì)報(bào)錯(cuò)
- setContentView()不能通過(guò)注解實(shí)現(xiàn)盛霎。
- ButterKnife已經(jīng)更新到版本8.x了赠橙,以前的版本中叫做@InjectView,7.x中叫@Bind愤炸,而現(xiàn) 在改用叫@BindView期揪。