Android ButterKnife(黃油刀)的使用

添加依賴

ButterKnife Github地址

雖然官網已經明確說明如何添加依賴, 我們還是做一下簡單的介紹:

step 1:

配置工程下的build.gradle文件


buildscript {
  repositories {
    mavenCentral()
   }
  dependencies {
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
  }
}

step 2:

配置Module下的build.gradle文件

apply plugin: 'android-apt'

android {
  ...
}

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

注意:

  1. 后面的版本號以github為準
  2. 注意不要忘記添加apply plugin: 'android-apt'

簡單使用

Activity中的使用


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...
  }
}

注:使用ButterKnife不能夠使用private和static修飾成員變量

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;
  }
}

獲取資源文件


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
  // ...
}

ViewHolder或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);
    }
  }
}

點擊事件處理

支持多個id同時處理


@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();
  }
}

注: 方法通常也不能設置private和static

ButterKnife的工作流程 (感謝bxbxbai)

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

  • 開始它會掃描Java代碼中所有的ButterKnife注解 @Bind 、 @OnClick 、 @OnItemClicked 等
  • 當它發(fā)現(xiàn)一個類中含有任何一個注解時值漫, ButterKnifeProcessor 會幫你生成一個Java類,名字類似 <className>$$ViewBinder ,這個新生成的類實現(xiàn)了 ViewBinder<T> 接口
  • 這個 ViewBinder 類中包含了所有對應的代碼,比如 @Bind 注解對應 findViewById() , @OnClick 對應了 view.setOnClickListener() 等等
  • 最后當Activity啟動 ButterKnife.bind(this) 執(zhí)行時勋乾,ButterKnife會去加載對應的 ViewBinder 類調用它們的 bind() 方法

** 圖解 **

ButterKnife原理
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嗡善,隨后出現(xiàn)的幾起案子辑莫,更是在濱河造成了極大的恐慌,老刑警劉巖罩引,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件各吨,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機揭蜒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門横浑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屉更,你說我怎么就攤上這事徙融。” “怎么了瑰谜?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵欺冀,是天一觀的道長。 經常有香客問我萨脑,道長隐轩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任渤早,我火速辦了婚禮职车,結果婚禮上,老公的妹妹穿的比我還像新娘鹊杖。我一直安慰自己悴灵,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布仅淑。 她就那樣靜靜地躺著称勋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涯竟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天空厌,我揣著相機與錄音庐船,去河邊找鬼。 笑死嘲更,一個胖子當著我的面吹牛筐钟,可吹牛的內容都是我干的。 我是一名探鬼主播赋朦,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼篓冲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宠哄?” 一聲冷哼從身側響起壹将,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎毛嫉,沒想到半個月后诽俯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡承粤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年暴区,在試婚紗的時候發(fā)現(xiàn)自己被綠了闯团。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡仙粱,死狀恐怖房交,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情伐割,我是刑警寧澤候味,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站口猜,受9級特大地震影響负溪,放射性物質發(fā)生泄漏。R本人自食惡果不足惜济炎,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一川抡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧须尚,春花似錦崖堤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撩轰,卻和暖如春胯甩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背堪嫂。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工偎箫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人皆串。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓淹办,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恶复。 傳聞我的和親對象是個殘疾皇子怜森,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內容