1. 程式人生 > >ButterKnife繫結失敗?android-apt沒用?嘗試用一下annotationProcessor

ButterKnife繫結失敗?android-apt沒用?嘗試用一下annotationProcessor

最近新專案使用ButterKnife時遇到了一個問題,明明gradle依賴已經添加了,程式碼中也綁定了,但是卻繫結失敗了。查詢資料原來是android apt的作者表示不再維護了,那這個apt不維護跟ButterKnife繫結失敗有什麼關係呢?
首先看看什麼是android apt?APT(Annotation Processing Tool)是一個註解處理工具。該工具對原始檔進行處理,找出其中的帶有註解的程式碼,並且對其中註解的部分生成額外的檔案。比如使用Butterknife寫出的程式碼如下所示:

@BindView(R.id.tv_title)
TextView mTitle
; @OnClick(R.id.iv_back) void onBackClicked(View view) { finish(); }

可以看出當獲取佈局中一個TextView時,在上面加上@BindView(R.id.id名)時,就相當於初始化了。是不是很簡單?用法應該來說很簡單,這裡就不再多說了,不過需要注意的是,如果使用Android ButterKnife Zelezny一鍵註解生成外掛時,則需要將游標放在當前佈局程式碼上面右擊,然後點選Generate中才會出現Generate ButterKnife Injections這個選項。否則找不到這個選項。
ButterKnife自動生成的原始檔如下:

public class TestActivity_ViewBinding<T extends TestActivity> implements Unbinder {
  protected T target;
  private View view2131689760;

  public TestActivity_ViewBinding(final T target, View source) {
    this.target = target;
    View view;
    target.mTitle = Utils.findRequiredViewAsType(source, R.id.tv_title, "field 'mTitle'"
, TextView.class); view = Utils.findRequiredView(source, R.id.iv_back, "method 'onBackClicked'"); view2131689760 = view; view.setOnClickListener(new DebouncingOnClickListener() { @Override public void doClick(View p0) { target.onBackClicked(p0); } }); } @Override public void unbind() { T target = this.target; if (target == null) throw new IllegalStateException("Bindings already cleared."); target.mTitle = null; view2131689760.setOnClickListener(null); view2131689760 = null; this.target = null; } }

我們可以看出當編譯後會自動生成這個原始檔,檔名就是TestActivity_ViewBinding,說明這是在TestActivity的基礎上生成的原始檔。這裡Utils.findRequiredViewAsType()方法幫我們自動找到佈局檔案中的id,然後生成控制元件。用到@onCLick註解則自動加上了View.setOnClickListener()方法。在unBind()方法中則對目標進行清空,釋放資源,應該說ButterKnife封裝的非常好,使用很方便。
也就是說我們如此快捷的獲取到當前控制元件的背後都是這個APT的功勞,那麼現在這個APT不在維護了。我們應該如何使用這些註解類的工具呢?官方推薦是在gradle外掛版本在2.2以上版本進行使用annotationProcessor。從apt換到annotationProcessor也是非常簡單的。
如果原來已經用了apt的工具,那麼首先將原來apt配置刪除。在Module中的gradle中將下列apt語句刪除:
dependencies {
apt ‘com.jakewharton:butterknife-compiler:8.3.0’
}
接著在Module中gradle的dependencies中加上下列程式碼:

    dependencies { 
        annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
        compile 'com.jakewharton:butterknife:8.5.1'
} 

好了,就是這麼簡單,其實就是把apt替換成了annotationProcessor,重新編譯執行一下吧。。。
以後註解相關的外掛慢慢不用android-apt啦,比如EventBus還有Google的dagger,可以嘗試用下annotationProcessor吧。