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'