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
Что не так в моем коде?
Спасибо
Ответы
Ответ 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 {
...
}
}