1. 程式人生 > >元件化開發butterknife 在 library中使用的坑

元件化開發butterknife 在 library中使用的坑

在Android開發中butterknife是一個很好的對資源初始化的工具,它可以使你的程式碼簡潔通俗易懂,同時配合Android ButterKnife Zelezny外掛可以讓你寫程式碼的速度提升至少20倍。

在一般app中我們都是單元件開發,什麼意思呢,你只有一個主moduel,所有程式碼不管是java,xml,資源,依賴庫都在app中,這個時候使用butterknife是非常簡單的,如GitHub地址描述照著做就可以了。

  • 第一步 在app底下的build.gradle中新增這兩個依賴。
dependencies {
  compile 'com.jakewharton:butterknife:8.5.1'
  annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}
  • 第二步 在activity中如圖使用即可,別忘了在oncreate方法中新增 ButterKnife.bind(this);
class ExampleActivity extends Activity {
  @BindView(R2.id.user) EditText username;
  @BindView(R2.id.pass) EditText password;
...
}

一切順其自然,一般照著做都不會有問題。

  • 重點是當你想對專案進行元件化開發時,butterknife的使用就不是那麼簡單了,當然GitHub上也有說明怎麼在library中使用方法,我和多數人情況一樣最終發現照著作者的使用示例不管你怎麼調整都將是一個大坑,最終都是無法使用。github上也有很多反饋,發現所有人都是一臉懵逼,連作者都是一臉懵逼。

11491621699_.pic_hd.jpg

下面介紹根據我無限嘗試總結出的在元件化開發中library中如何使用butterknife.

  • 首先不能像github地址描述的那樣使用依賴,在全域性build.gradle 中請這樣寫,特別注意版本,不要使用最新的8.5.1 而應該使用8.4.0,不要問我為什麼。
buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
  • 在library里正常引入butterknife,這裡可以使用最新版本8.5.1。 1、在library中build.gradle中引入外掛apply plugin: 'com.jakewharton.butterknife' 2、 dependencies 中新增依賴
dependencies {
  compile 'com.jakewharton:butterknife:8.5.1'
  annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}

到此使用前期工作就算做完了,下面介紹在library中如何使用和注意事項。

  • butterknife在library activity中的使用和注意事項 1、用R2代替R findviewid
 @BindView(R2.id.textView)
    TextView textView;
    @BindView(R2.id.button1)
    Button button1;
    @BindView(R2.id.button2)
    Button button2;
    @BindView(R2.id.button3)
    Button button3;
    @BindView(R2.id.image)
    ImageView image;

2、在click方法中同樣使用R2,但是找id的時候使用R。

 @OnClick({R2.id.textView, R2.id.button1, R2.id.button2, R2.id.button3, R2.id.image})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.textView:
                break;
            case R.id.button1:
               
                break;
            case R.id.button2:
                break;
            case R.id.button3:
                break;
            case R.id.image:
                break;
        }
    }

3、特別注意library中switch-case的使用,在library中是不能使用switch- case 找id的,解決方法就是用if-else代替。

  @OnClick({R2.id.textView, R2.id.button1, R2.id.button2, R2.id.button3, R2.id.image})
    public void onViewClicked(View view) {
        int i = view.getId();
        if (i == R.id.textView) {
        } else if (i == R.id.button1) {
        } else if (i == R.id.button2) {
        } else if (i == R.id.button3) {
        } else if (i == R.id.image) {
        }
    }