1. 程式人生 > >安卓專案實戰之ButterKnife8.8.1的詳細使用

安卓專案實戰之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("天若有情天亦老");
    } 

效果與手動註解一樣,對於安卓開發工作者來說,這個外掛確實是個神器,節省了大量初始化控制元件的時間。