ButterKnife8的配置及使用

前言

從最初接觸的 ButterKnife 5.0 到后來的 ButterKnife 7.0 大改動辑莫,再到如今的 ButterKnife 8.4涧尿,ButterKnife也在不斷的進(jìn)步,相對于 ButterKnife 7.0 最新的 ButterKnife 8.4 也有不小的改進(jìn)茴厉,這樣本文就重點來介紹一下8.4 的使用。

ButterKnife 的添加依賴

ButterKnife 8.4 在編譯方面改用 annotationProcessor(編譯時注解)耻姥,這樣就需要我們手動添加編譯注解器。

  1. 首先,在Project的build.grade 中如圖添加:


  2. 接下來来农,在app的build.gradle中添加聲明,并引入依賴崇堰。



ButterKnife 的使用

ButterKnife 使用形式并沒有打的改動沃于,相對于Butterknife 7.0部分注解的名稱有做修改。

首先說一下不論是哪個版本的ButterKnife 都需要注意的幾個點:

  • ButterKnife.bind(this); 的使用一定是在setContentView()之后的海诲;
  • 不管注解的是對象還是函數(shù)方法都不能用private 或者 static 修飾繁莹,否則會報錯
  1. Activity中 綁定view
    使用 @BindView 加上一個ID的形式 來注解,即可自動的映射出布局中的相對應(yīng)的View特幔。
class ExampleActivity extends Activity {
  @BindView(R.id.title) TextView title;
  @BindView(R.id.subtitle) TextView subtitle;
  @BindView(R.id.footer) TextView footer;

  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    ButterKnife.bind(this);
    // TODO Use fields...
  }
}
  1. 資源綁定
    使用@BindBool咨演,@BindColor,@BindDimen蚯斯,@BindDrawable薄风,@BindInt,@BindString綁定預(yù)定義的資源拍嵌,通過以下形式綁定到其相應(yīng)的字段遭赂。
class ExampleActivity extends Activity {
  @BindString(R.string.title) String title;
  @BindDrawable(R.drawable.graphic) Drawable graphic;
  @BindColor(R.color.red) int red; // int or ColorStateList field
  @BindDimen(R.dimen.spacer) Float spacer; // int (for pixel size) or float (for exact value) field
  // ...
}
  1. 非Activity綁定
    還可以通過提供自己的根視圖對任意對象執(zhí)行綁定(以下以Fragment為例)。
public class FancyFragment extends Fragment {
  @BindView(R.id.button1) Button button1;
  @BindView(R.id.button2) Button button2;

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fancy_fragment, container, false);
    ButterKnife.bind(this, view);
    // TODO Use fields...
    return view;
  }
}

同樣這種形式也可以應(yīng)用在Adapter 中横辆,簡化視圖的持有形式撇他。

public class MyAdapter extends BaseAdapter {
  @Override public View getView(int position, View view, ViewGroup parent) {
    ViewHolder holder;
    if (view != null) {
      holder = (ViewHolder) view.getTag();
    } else {
      view = inflater.inflate(R.layout.whatever, parent, false);
      holder = new ViewHolder(view);
      view.setTag(holder);
    }

    holder.name.setText("John Doe");
    // etc...

    return view;
  }

  static class ViewHolder {
    @BindView(R.id.title) TextView name;
    @BindView(R.id.job_title) TextView jobTitle;

    public ViewHolder(View view) {
      ButterKnife.bind(this, view);
    }
  }
}
  1. 多View綁定
  • 將多個View 綁定到一個List 中 或者 數(shù)組也可以
@BindViews({ R.id.first_name, R.id.middle_name, R.id.last_name })
List<EditText> nameViews;
  • apply方法,一次性對列表中的所有View執(zhí)行操作。
    先來看一下apply方法都提供了那些重載:



    不僅僅有對列表或數(shù)組的批量操作龄糊,還有對單個視圖的操作逆粹。
    下面看一下具體使用:

ButterKnife.apply(nameViews, DISABLE);
ButterKnife.apply(nameViews, ENABLED, false);
//設(shè)置統(tǒng)一操作
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);
  }

由上面實例可以看出,ButterKnife 提供了Action和Setter接口炫惩,允許指定簡單的行為僻弹;其次,Android Property 成員也可以與apply方法一起使用他嚷。

ButterKnife.apply(nameViews, View.ALPHA, 0.0f);
  1. 監(jiān)聽器綁定
  • 監(jiān)聽器也可以自動配置到方法上,傳入的參數(shù)表示監(jiān)聽的對象蹋绽。
@OnClick(R.id.submit)
public void submit(View view) {
  // TODO submit data to server...
}
  • 監(jiān)聽器方法的參數(shù)是可選的,即可以無需添加參數(shù)筋蓖。
@OnClick(R.id.submit)
public void submit() {
  // TODO submit data to server...
}
  • 定義一個特定的類型卸耘,它會自動轉(zhuǎn)換,需要注意的是粘咖,定義的參數(shù)必須是監(jiān)聽的對象或者其父類蚣抗,否則會轉(zhuǎn)換錯誤。
@OnClick(R.id.submit)
public void sayHi(Button button) {
  button.setText("Hello!");
}
  • 同樣瓮下,可以將一個方法配置給多個id,這里也有一點需要注意翰铡,傳入的參數(shù)必須要是各個監(jiān)聽對象共同的父類钝域。
@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();
  }
}
  • 自定義View可以通過不指定ID來綁定到自己的監(jiān)聽器。
public class FancyButton extends Button {
  @OnClick
  public void onClick() {
    // TODO do something!
  }
}
  1. 綁定解綁
    ** ButterKnife 8.4 相對于 ButterKnife 7.0 添加了解綁機(jī)制锭魔,要求Fragment在適當(dāng)?shù)臅r候進(jìn)行解綁例证。**
    Fragment具有與Activity不同的生命周期。 當(dāng)在onCreateView中綁定Fragment時迷捧,需要在onDestroyView中將視圖設(shè)置為null织咧。 ButterKnife會在bind 時返回一個Unbinder實例。 在適當(dāng)?shù)纳芷诨卣{(diào)中調(diào)用其unbind方法漠秋。
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();
  }
}
  1. 可選性綁定
    在使用過程中笙蒙,ButterKnife 還考慮到了 綁定時出現(xiàn)綁定目標(biāo)未找到的情況。默認(rèn)情況下膛堤,未找到會直接拋出異常手趣,如果需要避免拋出異常,ButterKnife也提供了結(jié)果方案肥荔,只需要 用 @Nullable 來注解 屬性绿渣,或者使用 @Optional來注解方法即可,使用如下燕耿。
@Nullable @BindView(R.id.might_not_be_there) TextView mightNotBeThere;
@Optional @OnClick(R.id.maybe_missing) void onMaybeMissingClicked() {
  // TODO ...
}
  1. ButterKnife.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);
  1. 其他監(jiān)聽器
    ButterKnife 同時還提供了其他的監(jiān)聽器中符。



    這里我們以 onItemSelected 為例:

@OnItemSelected(R.id.list_view)
void onItemSelected(int position) {
  // TODO ...
}
@OnItemSelected(value = R.id.maybe_missing, callback = NOTHING_SELECTED)
void onNothingSelected() {
  // TODO ...
}

方法的參數(shù)是可選的,但同時需要符合 注解參數(shù)的要求誉帅,不能多參或者出現(xiàn)參數(shù)類型不存在的問題淀散,如果出現(xiàn)參數(shù)類型相同的情況,方法的參數(shù)會從左到右依次匹配蚜锨。

總結(jié):

本文例子 來源于 Butter Knife官網(wǎng)档插,文中的介紹也主要是根據(jù)官網(wǎng)給出的總結(jié),并且加入了個人在使用過程中的一些看法亚再,就算是一份學(xué)習(xí)筆記吧郭膛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市氛悬,隨后出現(xiàn)的幾起案子则剃,更是在濱河造成了極大的恐慌,老刑警劉巖如捅,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棍现,死亡現(xiàn)場離奇詭異,居然都是意外死亡镜遣,警方通過查閱死者的電腦和手機(jī)己肮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人朴肺,你說我怎么就攤上這事窖剑。” “怎么了戈稿?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長讶舰。 經(jīng)常有香客問我鞍盗,道長,這世上最難降的妖魔是什么跳昼? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任般甲,我火速辦了婚禮,結(jié)果婚禮上鹅颊,老公的妹妹穿的比我還像新娘敷存。我一直安慰自己,他們只是感情好堪伍,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布锚烦。 她就那樣靜靜地躺著,像睡著了一般帝雇。 火紅的嫁衣襯著肌膚如雪涮俄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天尸闸,我揣著相機(jī)與錄音彻亲,去河邊找鬼。 笑死吮廉,一個胖子當(dāng)著我的面吹牛苞尝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宦芦,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼宙址,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了踪旷?” 一聲冷哼從身側(cè)響起曼氛,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎令野,沒想到半個月后舀患,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡气破,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年聊浅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡低匙,死狀恐怖旷痕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情顽冶,我是刑警寧澤欺抗,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站强重,受9級特大地震影響绞呈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜间景,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一佃声、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧倘要,春花似錦圾亏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哮缺,卻和暖如春弄跌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尝苇。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工铛只, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糠溜。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓淳玩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親非竿。 傳聞我的和親對象是個殘疾皇子蜕着,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

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