Butterknife 8.4.0 не находит просмотров после повторного запуска приложения. Он получает исключение NullPointerException
После повторного запуска приложения в Android Studio Butterknife.bind(this)
больше не будет отображаться. Единственное надежное решение, которое я нашел до сих пор, - это Cleaning/Rebuilding Project
и запустить его снова. Затем он находит представления снова до следующего повторного запуска. Это невероятно раздражает до сих пор и занимает минимум две минуты для восстановления.
У меня есть следующий build.gradle
android {
compileSdkVersion 24
buildToolsVersion "25.0.0"
defaultConfig {
applicationId "xx"
minSdkVersion 21
targetSdkVersion 24
versionCode x
versionName "xxx"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
jackOptions {
enabled true
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
packagingOptions {
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
compile 'com.jakewharton:butterknife:8.4.0'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support:support-annotations:24.2.1'
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:design:24.2.1'
compile 'com.android.support:support-v13:24.2.1'
compile 'com.android.support:support-v4:24.2.1'
compile 'com.android.support.test.espresso:espresso-idling-resource:2.2.2'
}
Я также использую инструменты построения com.android.tools.build:gradle:2.2.2
С Butterknife.setDebug(true)
я получаю следующее:
D/ButterKnife: Looking up binding for xx.LoginFragment
D/ButterKnife: Not found. Trying superclass xx.BaseFragment
D/ButterKnife: Not found. Trying superclass android.app.Fragment
D/ButterKnife: MISS: Reached framework class. Abandoning search.
BaseFragment
связывает и LoginFragment
расширяет его.
Похоже на это
BaseFragment import android.app.Fragment;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(getLayoutResourceId(), container, false);
ButterKnife.setDebug(true);
unbinder = ButterKnife.bind(this, v);
initViews(v);
return v;
}
LoginFragment
@BindView(R.id.inputEmail)
protected EditText inputEmail;
@Override
protected void initViews(View v) {
EditTextFocusListener focusListener = new EditTextFocusListener();
inputEmail.setOnFocusChangeListener(focusListener);
}
И stacktrace
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.EditText.setOnFocusChangeListener(android.view.View$OnFocusChangeListener)' on a null object reference
at xx.LoginFragment.initViews(LoginFragment.java:51)
at xx.BaseFragment.onCreateView(BaseFragment.java:53)
Как я уже говорил, единственным надежным на данный момент решением является полный clean/rebuild
всего проекта. Эта точная структура отлично работала перед использованием jackCompiler
, и я больше не могу ее отключать. От него зависит большая часть кода.
Ответы
Ответ 1
Это временное решение, пока у кого-то не будет лучшего ответа или он будет выпущен на стабильном канале.
Я перешел на канальный канал и обновил Android Studio до 2.3 Canary и com.android.tools.build:gradle:2.3.0-alpha1
. Все остальное остается таким же, как и в открытии сообщения.
EDIT: В конечном итоге я решил отключить jackCompiler
и вернуться к Java 1.7. Теперь он стабилен.
jackOptions {
enabled false
}
Ответ 2
страница github говорит использовать annotationProcessor
, но На странице jakewharton.github.io говорится использовать apt
.
Основываясь на этом SO post, это звучит как проблема с инструкциями и версией используемого плагина Android Gradle (хотя я используя 2.2.2 и все еще видел проблему).
Обновление за октябрь 2016 года: Вероятно, вам не нужны apt и android-apt plugin. Версия 2.2 плагина Android Gradleимеет конфигурацию аннотацииProcessor, которую вы должны использовать вместо этого.
Но вы должны попробовать это
Попробуйте изменить
annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
с
apt 'com.jakewharton:butterknife-compiler:8.4.0'
Ответ 3
Смотрите здесь. Пожалуйста, включите это:
В Gradle
:
compile 'com.jakewharton:butterknife:8.4.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
.
Это может вам помочь.
Ответ 4
Я думаю, что вы отсутствуете в проекте gradle примерно так:
classpath 'com.android.tools.build:gradle:2.2.2'