web-dev-qa-db-ja.com

バターナイフがnullポインターを返す

プロジェクトでバターナイフを使用したいと思います。バターナイフのチュートリアルに従ってすべてを行いました。しかし、ビュー(setText、setClickListener ...)に何かを設定すると、nullオブジェクト参照例外が発生しました。

これは私のコードです:

public class LoginActivity extends AppCompatActivity implements LoginView, View.OnClickListener {

@BindView(R.id.acEtUsername) AppCompatEditText userName;
@BindView(R.id.acEtPassword) AppCompatEditText password;
@BindView(R.id.prgCheckLogin) ProgressBar prgCheckLogin;
@BindView(R.id.btnLogin) Button btnLogin;

LoginPresenter loginPresenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    ButterKnife.bind(this);
    ButterKnife.setDebug(true);

    loginPresenter = new LoginPresenterImpl(this);

    btnLogin.setOnClickListener(this); // or userName.setText("userName");
  }
  /** Other Methods **/

activity_login.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:paddingBottom="@dimen/activity_vertical_margin"
    Android:paddingLeft="@dimen/activity_horizontal_margin"
    Android:paddingRight="@dimen/activity_horizontal_margin"
    Android:paddingTop="@dimen/activity_vertical_margin">

    <Android.support.v7.widget.AppCompatEditText
        Android:id="@+id/acEtUsername"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center"
        Android:gravity="center"
        Android:layout_marginRight="32dp"
        Android:layout_marginLeft="32dp"
        Android:hint="@string/user_name"/>

    <Android.support.v7.widget.AppCompatEditText
        Android:id="@+id/acEtPassword"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center"
        Android:gravity="center"
        Android:layout_marginTop="8dp"
        Android:layout_marginRight="32dp"
        Android:layout_marginLeft="32dp"
        Android:hint="@string/password"/>

    <Button
        Android:id="@+id/btnLogin"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center"
        Android:layout_margin="8dp"
        Android:text="@string/login"/>

    <ProgressBar
        Android:id="@+id/prgCheckLogin"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:visibility="gone"
        Android:layout_gravity="center|bottom"/>

</LinearLayout>

そしてエラーログ

 Caused by: Java.lang.NullPointerException: Attempt to invoke virtual method 'void Android.support.v7.widget.AppCompatEditText.setText(Java.lang.CharSequence)' on a null object reference

私のコードの何が問題になっていますか?

ありがとう

16
FarshidABZ

それを私が直した。

私のbuild.gradleに問題があります

追加するのを忘れた

apt 'com.jakewharton:butterknife-compiler:8.0.1'

build.gradleに

みんなありがとう

[〜#〜]更新[〜#〜]

neenbedankt.Android-aptプラグインを使用している場合は、最初にそれを削除します。

次にapt 'com.jakewharton:butterknife-compiler:8.0.1'を削除します

そして、依存関係にannotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'を追加します。

更新2

Kotlin replaceを使用している場合:

annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

と:

kapt 'com.jakewharton:butterknife-compiler:8.8.1'

そして、追加することを忘れないでください

apply plugin: 'kotlin-kapt'

後:

apply plugin: 'kotlin-Android'
apply plugin: 'kotlin-Android-extensions'
36
FarshidABZ

onCreateメソッドで、次の行があることを確認します。

ButterKnife.bind(this);

その行がないと、設定したバインドは実行されず、ビューはnullのままです。

17
Jerry Frost

新しい バターナイフ バージョンを使用している場合は、以下を使用します。

compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

Kotlinを使用している場合は、annotationProcessorkaptに置き換えます。

更新:

プロジェクトでGradleプラグイン3.0以上を使用している場合は、compileimplementationに変更します。以下のように:

implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
11
Darush

はい、ジェイクウォートンのバターナイフが8.0.1に更新されました

手順については、彼のgitアカウントを参照してください Butterknife Git

最後の注意:ラインapply plugin ...がファイルの上部のどこかに配置されていることを確認してください。

2
ralphgabb

既存のプロジェクトで、DataBindingとKotlinのサポートを追加すると、NPEエラーが発生し始めました。

私が持っていた:

annotationProcessor 'com.jakewharton:butterknife-compiler:x.x.x'

..そして次のものに置き換えられる:

kapt "com.jakewharton:butterknife-compiler:x.x.x"

2

同じ例外が発生しました。私の場合、app-module _build.gradle_ファイルにjcenter()リポジトリを追加するのを忘れていました。

_buildscript {
    repositories {
        mavenCentral()
        //this was missed
        jcenter()
    }
    dependencies {
        ...
    }
}
_
0
Jackky777