Square全家桶正傳——偷懶神器ButterKnife及其附屬插件的使用

寫作原因:程序員喜歡偷懶坚踩,對于安卓程序員來說,把時(shí)間花在不用動(dòng)腦筋的findViewById()上簡直讓人難以忍受韭邓。此外大量的點(diǎn)擊監(jiān)聽事件的分散化使得代碼可讀性下降澎埠。于是虽缕,基于注解的ButterKnife應(yīng)運(yùn)而生。

參考鏈接:

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

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

ButterKnife-Zelezny地址:https://github.com/avast/android-butterknife-zelezny


簡介

先來看看ButterKnife有哪些功能吧蒲稳,官網(wǎng)上是這樣描述的:

  1. 通過使用@BindView來消除調(diào)用findViewById()氮趋;
  2. 可以把多個(gè)View放在一個(gè)數(shù)組或者list中。然后一次性可以同時(shí)對這些View的動(dòng)作江耀,屬性等進(jìn)行操作凭峡;
  3. 通過使用@OnClick注解來消除由監(jiān)聽器帶來的匿名內(nèi)部類;
  4. 通過對resource進(jìn)行注解來消除多余的資源查找代碼决记。

獲取ButterKnife:

  1. 在你的項(xiàng)目的build.gradle中加入以下依賴:
buildscript {
  repositories {
    mavenCentral()
   }
  dependencies {
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
  }
}
  1. 在你的Module的build.gradle中加入以下依賴:
apply plugin: 'android-apt'

android {
  ...
}

dependencies {
  compile 'com.jakewharton:butterknife:8.1.0'
  apt 'com.jakewharton:butterknife-compiler:8.1.0'
}

注意:apply plugin: 'android-apt'

基本使用

下面的代碼演示了ButterKnife的基本使用技巧:

class ExampleActivity extends Activity {
  @BindView(R.id.user) EditText username;
  @BindView(R.id.pass) EditText password;

  @BindString(R.string.login_error) String loginErrorMessage;

  @OnClick(R.id.submit) void submit() {
    // TODO call server...
  }

  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    ButterKnife.bind(this);
    // TODO Use fields...
  }
}

包括以下幾個(gè)步驟:

1.定義UnBinder對象,對待操作元素進(jìn)行注解:

定義:private UnBinder unBinder;

對View:@BindView(R.id.user) EditText username;

對Resource:@BindString(R.string.login_error) String loginErrorMessage;

(注:資源綁定有以下注解:@BindBool, @BindColor, @BindDimen, @BindDrawable, @BindInt, @BindString)

對監(jiān)聽事件:

@OnClick(R.id.submit) void submit() {
  // TODO call server...
}

2.在onCreate方法或者onCreateView方法中調(diào)用方法:

unBinder = ButterKnife.bind(this);//如果在Fragment中使用ButterKnife.bind(this,view);

3.在onDestory方法或者onDestoryView中解除綁定:

unBinder = ButterKnife.unbind();

進(jìn)階操作:

1.利用ViewList實(shí)現(xiàn)同時(shí)配置多個(gè)View:

①. 將多個(gè)View綁定到一個(gè)List中:

@BindViews({ R.id.first_name, R.id.middle_name, R.id.last_name })
List<EditText> nameViews;

②. 調(diào)用ButterKnife.apply()方法:

ButterKnife.apply(nameViews, DISABLE);
ButterKnife.apply(nameViews, ENABLED, false);
ButterKnife.apply(nameViews, View.ALPHA, 0.0f);

按照官網(wǎng)的思路倍踪,上面三行分別是對nameViews中所有View的action系宫,Setter和Property的設(shè)置索昂,但是僅僅調(diào)用了apply()方法并不能真正修改nameViews中的View,必須完成下一步工作扩借。

③. 實(shí)現(xiàn)接口:

static final ButterKnife.Action<View> DISABLE = new ButterKnife.Action<View>() {
  @Override public void apply(View view, int index) {
    view.setEnabled(false);
  }
};
static final ButterKnife.Setter<View, Boolean> ENABLED = new ButterKnife.Setter<View, Boolean>() {
  @Override public void set(View view, Boolean value, int index) {
    view.setEnabled(value);
  }
};

上面代碼已經(jīng)將action和Setter實(shí)現(xiàn)椒惨,重寫接口內(nèi)部方法apply或set,在內(nèi)部實(shí)現(xiàn)對nameViews的操作潮罪。這樣就完成了同時(shí)操作多個(gè)View的功能康谆。

2. 利用形參直接對當(dāng)前View進(jìn)行操作

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

3. 實(shí)現(xiàn)多View點(diǎn)擊事件的關(guān)聯(lián)(原理同2)

@OnClick({ R.id.door1, R.id.door2, R.id.door3 })
public void pickDoor(DoorView door) {
  if (door.hasPrizeBehind()) {
    Toast.makeText(this, "You win!", LENGTH_SHORT).show();
  } else {
    Toast.makeText(this, "Try again", LENGTH_SHORT).show();
  }
}

4.防止目標(biāo)View不存在出現(xiàn)exception的請況的發(fā)生

@Nullable @BindView(R.id.might_not_be_there) TextView mightNotBeThere;

@Optional @OnClick(R.id.maybe_missing) void onMaybeMissingClicked() {
  // TODO ...
}

通過使用@Nullable或者@Optional實(shí)現(xiàn)防止因?yàn)槟繕?biāo)View不存在出現(xiàn)exception的請況的發(fā)生。

5. 代替onItemClickListener的注解實(shí)現(xiàn)

@OnItemSelected(R.id.list_view)
void onItemSelected(int position) {
  // TODO ...
}

6. 通過LayoutInflater獲取View的ButterKnife實(shí)現(xiàn)方法findById:

View view = LayoutInflater.from(context).inflate(R.layout.thing, null);
TextView firstName = ButterKnife.findById(view, R.id.first_name);
TextView lastName = ButterKnife.findById(view, R.id.last_name);
ImageView photo = ButterKnife.findById(view, R.id.photo);

注:這個(gè)真沒覺得哪里簡單了嫉到。沃暗。。

到此我們講完了ButterKnife的基本使用何恶。怎樣不錯(cuò)吧孽锥?下面有更強(qiáng)大的東西——ButterKnifeZelezny,配合著這個(gè)神器一起使用细层,可以為我們的項(xiàng)目節(jié)省大量時(shí)間和增加代碼可讀性惜辑。

ButterKnifeZelezny

下載地址:

http://plugins.jetbrains.com/plugin/7369

關(guān)于AS安裝插件的問題在這里不多闡述了,不會(huì)的自行百度疫赎。

基本用法

下面這幅圖展示了ButterKnifeZelezny的基本用法盛撑。


bkz
bkz

基本步驟:

  1. 有所使用的布局 ID 上點(diǎn)擊右鍵 (例如上圖中的 R.layout.activity_settings ), 然后選擇 Generate -> Generate ButterKnife Injections
  2. 在對話框中選擇需要注入的 View捧搞, 還有個(gè)選項(xiàng)可以給 Adapter 創(chuàng)建一個(gè) ViewHolder抵卫。
  3. 點(diǎn)擊 Confirm , 代碼自動(dòng)生成实牡!

總結(jié):

本文只是關(guān)于ButterKnife用法的介紹陌僵,關(guān)于Java中的依賴注解的知識(shí)博主仍在學(xué)習(xí)中,有興趣參照《Java編程思想》一書關(guān)于Annotation的介紹创坞,此外歡迎繼續(xù)關(guān)注博主的Square全家桶系列碗短。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市题涨,隨后出現(xiàn)的幾起案子偎谁,更是在濱河造成了極大的恐慌,老刑警劉巖纲堵,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巡雨,死亡現(xiàn)場離奇詭異,居然都是意外死亡席函,警方通過查閱死者的電腦和手機(jī)铐望,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人正蛙,你說我怎么就攤上這事督弓。” “怎么了乒验?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵愚隧,是天一觀的道長。 經(jīng)常有香客問我锻全,道長狂塘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任鳄厌,我火速辦了婚禮荞胡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘部翘。我一直安慰自己硝训,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布新思。 她就那樣靜靜地躺著窖梁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夹囚。 梳的紋絲不亂的頭發(fā)上纵刘,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機(jī)與錄音荸哟,去河邊找鬼假哎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鞍历,可吹牛的內(nèi)容都是我干的舵抹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼劣砍,長吁一口氣:“原來是場噩夢啊……” “哼惧蛹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起刑枝,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤香嗓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后装畅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體靠娱,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年掠兄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了像云。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锌雀。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖苫费,靈堂內(nèi)的尸體忽然破棺而出汤锨,到底是詐尸還是另有隱情,我是刑警寧澤百框,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站牍汹,受9級特大地震影響铐维,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜慎菲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一嫁蛇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧露该,春花似錦睬棚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撵摆,卻和暖如春底靠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背特铝。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工暑中, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鲫剿。 一個(gè)月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓鳄逾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親灵莲。 傳聞我的和親對象是個(gè)殘疾皇子雕凹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

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