安卓專案實戰之ButterKnife8.8.1的詳細使用
ButterKnife簡介
ButterKnife是一個專注於Android系統的View注入框架,以前總是要寫很多findViewById來找到View物件,有了ButterKnife可以很輕鬆的省去這些步驟。是大神JakeWharton的力作,目前使用很廣。最重要的一點,使用ButterKnife對效能基本沒有損失,因為ButterKnife用到的註解並不是在執行時反射的,而是在編譯的時候生成新的class。專案整合起來也是特別方便,使用起來也是特別簡單。
ButterKnife優勢
1、強大的View繫結和Click事件處理功能,簡化程式碼,提升開發效率 2、方便的處理Adapter裡的ViewHolder繫結問題 3、執行時不會影響APP效率,使用配置方便 4、程式碼清晰,可讀性強
ButterKnife版本注意
ButterKinfe的註解標籤因版本不同而有所變化: 8.0.0之前的Bind標籤在8.0.0之後變成了BindView。 而8.7.0之後在依賴的library中的activity中繫結view時,要用R2.id.XXX,而不再是常用的R.id.XXX,如果是直接在應用的activity中使用,R和R2兩者沒什麼區別。 Note:網上說使用R2是因為library中的R欄位的id值不是final型別的, 但是你的應用module中確是final型別的,所以在自己的應用中使用R和R2區別不大個人認為。
ButterKnife使用注意
1.使用ButterKnife修飾的方法和控制元件,不能用private or static 修飾。 否則會報錯:錯誤: @BindView fields must not be private or static 2.在Activity 類中繫結:ButterKnife.bind(this);必須在setContentView();之後繫結,且父類bind繫結後,子類不需要再bind。 3.在非Activity 類(例如:Fragment、ViewHold)中繫結:ButterKnife.bind(this,view);這裡的this不能替換成getActivity()。 4.在Activity中不需要做解綁操作,在Fragment 中必須在onDestroyView()中做解綁操作。
ButterKnife的配置
1、如果你是直接在app中使用,只需在app的 build.gradle 中新增如下程式碼:
dependencies {
compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}
2、如果是在專案依賴的Library庫中使用,那麼按照GitHub上的配置會報錯,參考部落格https://blog.csdn.net/zyw0101/article/details/80399225的解決方案如下: 1.在Project的build.gradle檔案中新增:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1' //新增這一行
}
}
這裡注意butterknife的版本,8.8.1如果用不了,降低版本至8.5.1才可以使用,具體參見上面部落格地址。
2.在App的 build.gradle 中新增如下程式碼:
apply plugin: 'com.jakewharton.butterknife'
dependencies中新增:
compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
ButterKnife的使用示例
1.在Activity中使用:ButterKnife.bind(this);
- 由於每次使用都要在Activity中的onCreate繫結Activity,因此個人建議在專案的BaseActivity中完成繫結,子類繼承即可
- 必須在setContentView();之後繫結。
2.在Fragment中使用:ButterKnife.bind(this, view); 然後在onDestroyView回撥中呼叫它的unbind方法進行Fragment解綁。 3.在ViewHolder中使用:ButterKnife.bind(this, view); 在Adapter的ViewHolder中使用,將ViewHolder加一個構造方法,在new ViewHolder的時候把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);
}
}
4.繫結點選事件
@OnClick({R.id.login_btn_login})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.login_btn_login:
break;
default:
break;
}
}
// 單個元件點選事件的簡潔寫法,可以不帶引數
@OnClick(R2.id.button1 ) //給 button1 設定一個點選事件
public void showToast(){
Toast.makeText(this, "is a click", Toast.LENGTH_SHORT).show();
}
5.ViewPager的監聽:
@OnPageChange(R.id.viewpager)
public void onPageSelected(int position) {
switch (position) {
case 0:
break;
case 1:
break;
}
}
ButterKnife的混淆配置
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}
使用ButterKnife外掛進行一鍵初始化
開啟android的plugins中心,搜尋butterknife 點選browse repo,下載前兩個外掛都可以,一般下載評分高的即可。 下載完成後需重啟AS,回到activity程式碼的setContentview處,右鍵佈局檔名,注意一定要把游標停在佈局檔名上 選擇Generate,這時可以看到生成butterknife註解的選項,如果游標不放在佈局檔名上,則看不到該選項。 點選生成butterknife註解 外掛將佈局檔案中的所有id都加載出來了,還可以設定點選事件,點選confirm即可快速初始化控制元件,非常方便。
@BindView(R.id.tv_test1)
TextView tvTest1;
@BindView(R.id.btn_test1)
Button btnTest1;
@BindView(R.id.et_test1)
EditText etTest1;
@BindView(R.id.lv_test1)
ListView lvTest1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_butter_knife_test);
ButterKnife.bind(this);
tvTest1.setText("文字控制元件已被初始化");
btnTest1.setText("按鈕被初始化");
}
@OnClick(R.id.btn_test1)
public void onViewClicked() {
btnTest1.setText("我被點選了");
tvTest1.setText("天若有情天亦老");
}
效果與手動註解一樣,對於安卓開發工作者來說,這個外掛確實是個神器,節省了大量初始化控制元件的時間。