Подтвердить что ты не робот

Butter Knife возвращает нулевой указатель

Я хочу использовать Butter Knife в своем проекте. Я сделал все в соответствии с учебником Butter Knife. Но когда я устанавливаю что-либо в представлениях (setText, setClickListener...), я получил исключение ссылки на исключение.

Это мой код:

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

Что не так в моем коде?

Спасибо

4b9b3361

Ответ 1

Я починил это.

Есть проблема с моим 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, замените:

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'

Ответ 2

В вашем методе onCreate убедитесь, что у вас есть строка:

ButterKnife.bind(this);

Без этой строки привязки, которые вы настроили, не выполняются, и представления остаются пустыми.

Ответ 3

Используйте следующее, если вы используете новую версию Butter Knife:

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

Если вы используете Kotlin, замените annotationProcessor на kapt.

ОБНОВИТЬ:

Если вы используете в своем проекте плагин Gradle 3.0 или выше, измените compile на implementation. как ниже:

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

Ответ 4

Yep, Butterknife by Jake Wharton обновлен до 8.0.1

Пожалуйста, обратитесь к его учетной записи git для шагов Butterknife Git

В заключение: Убедитесь, что плагин подключен к строке... размещен где-то в верхней части файла.

Ответ 5

Я начал получать ошибки NPE, когда в существующем проекте я добавил поддержку DataBinding и Kotlin.

Я имел:

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

..и заменил на:

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

Ответ 6

У меня такое же исключение. В моем случае я забыл добавить репозиторий jcenter() в свой файл app-module build.gradle.

buildscript {
    repositories {
        mavenCentral()
        //this was missed
        jcenter()
    }
    dependencies {
        ...
    }
}