Murat Karagöz
Murat Karagöz

Reputation: 37604

Butterknife 8.4.0 does not find views after re-running the app. It gets a NullPointerException

After re-running the app in Android Studio Butterknife.bind(this) does not find the views anymore. The only reliable solution I found so far is by Cleaning/Rebuilding Project and run it again. Then it finds the views again until the next re-run. This is incredibly annoying so far and takes a minimum of two minutes for a rebuild.

I have the following 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'

}

I am also using build tools com.android.tools.build:gradle:2.2.2

With Butterknife.setDebug(true) I get the following:

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.

The BaseFragment does the binding and LoginFragment extends it. It looks like this

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);
    }

And the 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)

As I said before the only solution which is reliable at the moment is to do a full clean/rebuild of the whole project. This exact structure worked fine before using the jackCompiler and I can not disable it anymore. Major part of the code depends on it.

Upvotes: 16

Views: 1329

Answers (4)

msamardzic
msamardzic

Reputation: 1060

I think you missing in project gradle something like this:

classpath 'com.android.tools.build:gradle:2.2.2'

Upvotes: 0

Harshad Pansuriya
Harshad Pansuriya

Reputation: 20930

The github page says to use annotationProcessor but the jakewharton.github.io page says to use apt.

Based on this SO post, it sounds like it's an issue with the instructions vs the version of the Android Gradle plugin that is used (although I'm using 2.2.2 and still saw the issue).

Update for October 2016: You probably don't need apt and the android-apt plugin anymore. Version 2.2 of the Android Gradle plugin has an annotationProcessor configuration that you should be using instead.

But you should try this

Try to change

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

with

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

Upvotes: 4

Murat Karagöz
Murat Karagöz

Reputation: 37604

This is a temporary solution until someone has a better answer or it's released on the stable channel.

I changed to the canary channel and upgraded Android Studio to 2.3 Canary and com.android.tools.build:gradle:2.3.0-alpha1. Everything else stays the same as in the opening post.

EDIT: I ultimately decided to disable the jackCompiler and roll back to Java 1.7. It's stable now.

jackOptions {
        enabled false
    } 

Upvotes: 6

Satan Pandeya
Satan Pandeya

Reputation: 3815

See here. Please, include this :

At Gradle:

compile 'com.jakewharton:butterknife:8.4.0'

annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0' too.

This may help you.

Upvotes: 2

Related Questions