@BindView問題 Attempt to invoke virtual method 'void android ...' on a null object reference
Caused by:java.lang.NullPointerException:
Attempt to invoke virtual method 'void android.support.v7.widget.Toolbar.setNavigationIcon(int)' on a null object reference
我這邊是問題主要是 ButterKnife 版本更新問題, 8.0.0之前的Bind標籤在8.0.0之後變成了BindView, 我們直接把@Bind改為@BindView,編譯沒問題,可是執行就會報空指標。
問題復現:新增8.0以後的ButterKnife庫出現,繫結VIEW出現空指標問題
如:
解決方法:
第一步:在自己的工程Project檔案 build.gradle 中新增依賴路徑
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
如:
第二步:在module模組(如 app)檔案 build.gradle 中 新增依賴的 Butterknife jar
implementation 'com.jakewharton:butterknife:8.5.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
如:
第三步:安裝ButterKnife 元件,
開啟 File -> Setting -> plugins ,搜尋ButterKnife , 安裝 android ButterKnife Zelezny
如:
最後編譯,執行就Ok了。
關於butterknife使用,注意事項:
1、在Activity 類中繫結 :ButterKnife.bind(this);必須在setContentView();之後繫結;且父類bind繫結後,子類不需要再bind。
2、在非Activity 類(eg:Fragment、ViewHold)中繫結: ButterKnife.bind(this,view);這裡的this不能替換成getActivity()。
3、在Activity中不需要做解綁操作,在Fragment 中必須在onDestroyView()中做解綁操作。 4、使用ButterKnife修飾的方法和控制元件,不能用private or static 修飾,否則會報錯。錯誤: @BindView fields must not be private or static. (com.zyj.wifi.ButterknifeActivity.button1)
5、setContentView()不能通過註解實現。(其他的有些註解框架可以)
6、使用Activity為根檢視繫結任意物件時,如果你使用類似MVC的設計模式你可以在Activity 呼叫ButterKnife.bind(this, activity),來繫結Controller。
7、使用ButterKnife.bind(this,view)繫結一個view的子節點欄位。如果你在子View的佈局裡或者自定義view的構造方法裡 使用了inflate,你可以立刻呼叫此方法。或者,從XML inflate來的自定義view型別可以在onFinishInflate回撥方法中使用它。
總結:多動手,獨立思考
歡迎加入我的Java與Android逆向開發交流QQ群,交流學習。