1. 程式人生 > >@BindView問題 Attempt to invoke virtual method 'void android ...' on a null object reference

@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群,交流學習。