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吧。