Android butterknife

開發(fā)中找到xml中對(duì)應(yīng)的ui并設(shè)置對(duì)應(yīng)的事件,一般用findViewById握童,然后設(shè)置onClick事件來實(shí)現(xiàn)来候,這樣寫起來比較麻煩,有沒更簡單的仅仆?Butterknife本場(chǎng)的主角閃亮登場(chǎng).

Butterknife作用:
通過注解的方式來對(duì)Android View進(jìn)行綁定.

Butterknife的Github源碼如下:
https://github.com/JakeWharton/butterknife
對(duì)它的介紹可以看下面鏈接:
http://jakewharton.github.io/butterknife/

下面根據(jù)文檔描述,簡單的介紹下如何使用:

  • 注解實(shí)例變量view 取代findViewById
class ExampleActivity extends Activity {
  @BindView(R.id.title) 
  TextView title;//取代findViewByid(R.id.title)
  @BindView(R.id.subtitle) 
  TextView subtitle;//取代findViewByid(R.id.subtitle)
  @BindView(R.id.footer) 
  TextView footer;//取代findViewByid(R.id.footer)

  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    ButterKnife.bind(this);//注意這里必須設(shè)置綁定當(dāng)前Activity
    // TODO Use fields...
   //后續(xù)就可以直接使用比如
   title.setText("Just test");
  }
}

上面代碼在butterknife內(nèi)部生產(chǎn)類似下面的code

public void bind(ExampleActivity activity) {
  activity.subtitle = (android.widget.TextView) activity.findViewById(2130968578);
  activity.footer = (android.widget.TextView) activity.findViewById(2130968579);
  activity.title = (android.widget.TextView) activity.findViewById(2130968577);
}
  • 對(duì)資源綁定注解
    在Butterknife中定義如下對(duì)資源的注解
    @BindBool, @BindColor, @BindDimen, @BindDrawable, @BindInt, @BindString 上面的可以對(duì)應(yīng)獲取android res目錄下對(duì)應(yīng)的資源。
    舉個(gè)??:
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
  // ...
}
  • 不在Activity中如何使用butterknife
  1. bind對(duì)應(yīng)的view通過它們的root view,舉個(gè)例子在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);//注意這里傳入的是root view
    // TODO Use fields...
    return view;
  }
}

或者是在ViewHolder中使用

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

    public ViewHolder(View view) {
      ButterKnife.bind(this, view);//這里對(duì)應(yīng)的是bind(this,view)
    }
  }
  • 綁定View List
@BindViews({ R.id.first_name, R.id.middle_name, R.id.last_name })
List<EditText> nameViews;
  • 綁定View的事件
    對(duì)應(yīng)View onClick事件
@OnClick(R.id.submit)
public void submit(View view) {//其中submit方法中的參數(shù)是可選的
  // TODO submit data to server...
}

對(duì)應(yīng)ViewOnItemSelected事件

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

當(dāng)然也可以多個(gè)view對(duì)應(yīng)一個(gè)click事件如下:

@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的綁定事件更簡單如下:

public class FancyButton extends Button {
  @OnClick
  public void onClick() {
    // TODO do something!
  }
}
  • 釋放對(duì)應(yīng)的bind資源
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();//在onDestoryView中釋放對(duì)應(yīng)的資源
  }
}
  • 其他較為少用的方法
TextView firstName = ButterKnife.findById(view, R.id.first_name);
//替換findViewById 不需要強(qiáng)轉(zhuǎn)
//The apply method allows you to act on all the views in a list at once
ButterKnife.apply(nameViews, DISABLE); //馬上設(shè)置
ButterKnife.apply(nameViews, ENABLED, false);//設(shè)置

遇到版本問題叠荠,具體如下

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LogUtil.d("onCreate........................");
        myLocationListener = new MyLocationListener(getLifecycle());
        setContentView(R.layout.lifecycle_test);
        ButterKnife.bind(this);
    }

    @OnClick(R.id.btnJump)
    public void onClick(View view){
        Intent intent = new Intent(this, DatabaseStudyActivity.class);
        startActivity(intent);
    }

發(fā)現(xiàn)點(diǎn)擊Button無法響應(yīng)對(duì)應(yīng)的onClick時(shí)間,什么原因呢扫责?google了下發(fā)現(xiàn)是build.grandle配置出現(xiàn)了問題榛鼎,下面是build.gradle中的配置

    implementation 'com.jakewharton:butterknife:8.8.1'
    implementation 'com.jakewharton:butterknife-annotations:8.8.1'

ButterKnife從7.x到8.x后,運(yùn)行時(shí)和編譯器被分開來了鳖孤,所以需要加入compiler在build.grandle中者娱,如下所示:

annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

這樣整個(gè)build.gradle配置如下:

    implementation 'com.jakewharton:butterknife:8.8.1'
    implementation 'com.jakewharton:butterknife-annotations:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市苏揣,隨后出現(xiàn)的幾起案子黄鳍,更是在濱河造成了極大的恐慌,老刑警劉巖平匈,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件框沟,死亡現(xiàn)場(chǎng)離奇詭異藏古,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)忍燥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門校翔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灾前,你說我怎么就攤上這事防症。” “怎么了哎甲?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵蔫敲,是天一觀的道長。 經(jīng)常有香客問我炭玫,道長奈嘿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任吞加,我火速辦了婚禮裙犹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘衔憨。我一直安慰自己叶圃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布践图。 她就那樣靜靜地躺著掺冠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪码党。 梳的紋絲不亂的頭發(fā)上德崭,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音揖盘,去河邊找鬼眉厨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛兽狭,可吹牛的內(nèi)容都是我干的憾股。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼椭符,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼荔燎!你這毒婦竟也來了耻姥?” 一聲冷哼從身側(cè)響起销钝,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎琐簇,沒想到半個(gè)月后蒸健,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體座享,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年似忧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渣叛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盯捌,死狀恐怖淳衙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饺著,我是刑警寧澤箫攀,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站幼衰,受9級(jí)特大地震影響靴跛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜渡嚣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一梢睛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧识椰,春花似錦绝葡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至种蘸,卻和暖如春墓赴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背航瞭。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工诫硕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刊侯。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓章办,卻偏偏與公主長得像,于是被迫代替她去往敵國和親滨彻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子藕届,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348