1. ホーム
  2. アンドロイド

BindView 問題 NULLオブジェクト参照で仮想メソッド 'void android ...' を呼び出そうとする

2022-01-24 07:30:24

原因:java.lang.NullPointerException。

null オブジェクトの参照に対して仮想メソッド 'void android.support.v7.widget.Toolbar.setNavigationIcon(int)' を呼び出そうと試みました。

私側の問題は主に
ButterKnifeのバージョンアップ問題で、8.0.0以前のBindタグが8.0.0以降はBindViewになりました。
Bindを直接@BindViewに変更したところ、コンパイルは正常に行われますが、NULLポインターで実行されます。

問題は再発します。8.0以降でButterKnifeライブラリを追加すると、VIEWへのバインディング時にヌルポインタの問題が発生します。

例えば

解決策

ステップ1 プロジェクトのプロジェクトファイルbuild.gradleに依存関係のパスを追加します。

  classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'

例えば

ステップ2. 依存するButterknife jarをモジュールモジュール(例:app)ファイルbuild.gradleに追加します。

    implementation 'com.jakewharton:butterknife:8.5.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'

例えば

ステップ3 ButterKnifeコンポーネントをインストールします。

ファイル -> 設定 -> プラグインを開き、ButterKnifeを検索して、android ButterKnife Zeleznyをインストールします。

というように。

最後にコンパイルして実行するとOkです。

バターナイフの使用に関して、以下のことに注意してください。


    1. Activityクラスでのバインド : ButterKnife.bind(this); は setContentView(); の後にバインドする必要があり、親クラスがバインドした後は、子クラスは再度バインドする必要はありません。

    2. アクティビティ以外のクラスでバインドする(例:Fragment、ViewHold)。ButterKnife.bind(this, view); ここで、これはgetActivity()に置き換えることはできません。

    3. Activityでunbind操作をする必要はなく、FragmentのonDestroyView()でunbind操作をする必要があります。
    4. 4. ButterKnifeで変更したメソッドやコントロールは、privateやstaticで変更できない場合、エラーが報告されます。エラーになります。BindViewフィールドはprivateまたはstaticであってはなりません。(com.zyj.wifi.ButterknifeActivity.button1)

    5. setContentView()にアノテーションを付けることができない。(他のアノテーションフレームワークでは可能なものもある)。

    6、Activityを使ってルートビューに任意のオブジェクトをバインドする場合、MVCのようなデザインパターンを使っていれば、Activity内でButterKnife.bind(this, activity)を呼んで、Controllerをバインドすることができます。

    7. 7. ButterKnife.bind(this, view)を使用して、ビューの子フィールドをバインドします。子ビューのレイアウトやカスタムビューのコンストラクタで inflate を使用している場合、このメソッドをすぐに呼び出すことができます。また、XML inflateからのカスタムビュータイプでは、 onFinishInflateコールバックメソッドで使用することができます。

要約すると より実践的で自立的な思考

私のJavaとAndroidの逆引き開発交流QQグループに参加して、交流と勉強をすることを歓迎します。