2016-04-28 27 views
9

Voglio usare Butter Knife nel mio progetto. Ho fatto tutto secondo il tutorial Butter Knife. Ma quando imposto qualcosa sulle viste (setText, setClickListener ...) ho ottenuto un'eccezione di riferimento a oggetti null.Butter Knife return null pointer

Questo è il mio codice:

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> 

E errore di registro

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 

Cosa c'è di sbagliato nel mio codice?

Grazie

+0

Potete fornire 'activity_login.xml'? – nhaarman

+0

Puoi pubblicare anche il log degli errori –

+0

@nhaarman activity_login.xml Aggiunto – FarshidABZ

risposta

22

L'ho risolto.

C'è un problema con il mio build.gradle

Ho dimenticato di aggiungere

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

al build.gradle

ringraziare tutti

UPDATE

Se sei tu canta il plugin neenbedankt.android-apt per prima cosa rimuovilo.

Poi rimuovere apt 'com.jakewharton:butterknife-compiler:8.0.1'

e quindi aggiungere annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' alle dipendenze.

+0

Come hai funzionato in primo luogo senza dipendenza –

2

Yep, butterknife da Jake Wharton è stato aggiornato alla 8.0.1

Si prega di fare riferimento al suo conto git per i passaggi Butterknife Git

Sulla nota finale: assicurarsi che la linea di applicare plug ... è posto da qualche parte nella parte superiore del file.

0

Ho la stessa eccezione. Nel mio caso ho dimenticato di aggiungere il repository jcenter() nel mio modulo app-build.gradle.

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

nel metodo onCreate, assicurarsi di avere la linea:

ButterKnife.bind(this); 

Senza quella linea, si lega impostati non vengono eseguiti, e la vista rimangono nullo.

2

Usare il seguente se si sta usando la nuova versione Butter Knife:

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

Sto usando il. nuovo e ho lo stesso errore. –

+1

@MaximeClaude Se si utilizza Kotlin, sostituire annotationProcessor con kapt. Assicurati inoltre di aggiungere entrambe le linee. – Darush

+0

Grazie per l'input @Darush. Ho appena scoperto che il problema è che lo uso da un/a attività/frammento. Passo una vista a un costruttore di quella classe e cerco di legarlo lì. Forse è per questo che non funziona. –

Problemi correlati