2016-07-10 20 views
0

Ich versuche eine Übung von edx.org (Chat Firebase, ganzer Code von https://github.com/ykro/android-chat-firebase) und ich kann nicht verstehen, wo dieser Fehler kommt, es ist ein NPE, aber es bringt mich aus, es stürzt ab wenn Anwendung läuft auf Genymotion Emulator.NPE Button mit Butterknife

ERROR

java.lang.RuntimeException: Unable to start activity ComponentInfo{cat.edx_manel.exercises.chatfirebase/cat.edx_manel.exercises.chatfirebase.activities.LoginActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setEnabled(boolean)' on a null object reference 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148)                      
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setEnabled(boolean)' on a null object reference 
at cat.edx_manel.exercises.chatfirebase.activities.LoginActivity.setInputs(LoginActivity.java:114) 
at cat.edx_manel.exercises.chatfirebase.activities.LoginActivity.disableInputs(LoginActivity.java:57) 
at cat.edx_manel.exercises.chatfirebase.implementations.login.LoginPresenterImpl.checkForAuthenticateUser(LoginPresenterImpl.java:43) 
at cat.edx_manel.exercises.chatfirebase.activities.LoginActivity.onCreate(LoginActivity.java:46) 
at android.app.Activity.performCreate(Activity.java:6237) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:110) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
at android.app.ActivityThread.-wrap11(ActivityThread.java)  
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
at android.os.Handler.dispatchMessage(Handler.java:102)  
at android.os.Looper.loop(Looper.java:148)  
at android.app.ActivityThread.main(ActivityThread.java:5417)  
at java.lang.reflect.Method.invoke(Native Method) 

LOGINACTIVITY

public class LoginActivity extends AppCompatActivity implements LoginView { 

@BindView(R.id.user) 
EditText inputEmail; 
@BindView(R.id.pass) 
EditText inputPassword; 
@BindView(R.id.signIn) 
Button btnSignIn; 
@BindView(R.id.signUp) 
Button btnSignUp; 
@BindView(R.id.progressBar) 
ProgressBar progressBar; 
@BindView(R.id.layoutMainContainer) 
RelativeLayout container; 

private LoginPresenter loginPresenter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 
    ButterKnife.bind(this); 

    loginPresenter = new LoginPresenterImpl(this); 
    loginPresenter.onCreate(); 
    loginPresenter.checkForAuthenticateUser(); 
} 

@Override 
protected void onDestroy() { 
    loginPresenter.onDestroy(); 
    super.onDestroy(); 
} 

@Override 
public void disableInputs() { 
    setInputs(false); 
} 

@Override 
public void enableInputs() { 
    setInputs(true); 
    hideProgress(); 
} 

@Override 
public void showProgress() { 
    progressBar.setVisibility(View.VISIBLE); 
} 

@Override 
public void hideProgress() { 
    progressBar.setVisibility(View.INVISIBLE); 
} 

@Override 
@OnClick(R.id.signUp) 
public void handleSignUp() { 
    loginPresenter.registerNewUser(inputEmail.getText().toString(), 
      inputPassword.getText().toString()); 
} 
@Override 
@OnClick(R.id.signIn) 
public void handleSignIn() { 
    loginPresenter.validateLogin(inputEmail.getText().toString(), 
      inputPassword.getText().toString()); 
} 

@Override 
public void navigateToMainScreen() { 
    startActivity(new Intent(this, ContactListActivity.class)); 
} 

@Override 
public void loginError(String error) { 
    inputPassword.setText(""); 
    String msgError = String.format(getString(R.string.login_error_message_signin), error); 
    inputPassword.setError(msgError); 
} 

@Override 
public void newUserSuccess() { 
    Snackbar.make(container, R.string.login_error_message_signup, Snackbar.LENGTH_SHORT).show(); 
} 

@Override 
public void newUserError(String error) { 
    inputPassword.setText(""); 
    String msgError = String.format(getString(R.string.login_error_message_signup), error); 
    inputPassword.setError(msgError); 
} 

private void setInputs(boolean enabled) { 
    btnSignIn.setEnabled(enabled); 
    btnSignUp.setEnabled(enabled); 
    inputEmail.setEnabled(enabled); 
    inputPassword.setEnabled(enabled); 
    } 
} 

Wie Sie sehen können, Button von Buttermesser Rahmen binded ist, aber ich weiß nicht, was es bewirkt, dass ...

Vielen Dank

UPDATED

LAYOUT

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/layoutMainContainer" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:gravity="center" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context=".activities.LoginActivity"> 

<android.support.design.widget.TextInputLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:inputType="textPersonName" 
     android:hint="Name" 
     android:ems="10" 
     android:id="@+id/user"/> 

</android.support.design.widget.TextInputLayout> 

<android.support.design.widget.TextInputLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:inputType="textPersonName" 
     android:hint="Password" 
     android:ems="10" 
     android:id="@+id/pass"/> 

</android.support.design.widget.TextInputLayout> 

<LinearLayout 
    android:id="@+id/layoutButtons" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 

    <Button 
     android:id="@+id/signIn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <Button 
     android:id="@+id/signUp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

<ProgressBar 
    style="?android:attr/progressBarStyleLarge" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/progressBar" 
    android:layout_below="@id/layoutButtons"/> 

UPDATE 2

Loginview INTERFACE

public interface LoginView { 
void enableInputs(); 
void disableInputs(); 
void showProgress(); 
void hideProgress(); 

void handleSignUp(); 
void handleSignIn(); 

void navigateToMainScreen(); 
void loginError(String error); 

void newUserSuccess(); 
void newUserError(String error); 
} 
+1

Zeigen Sie uns die Layout-Datei. – slanecek

+0

Eine letzte Anfrage; poste deine LoginView Schnittstelle – Eenvincible

+0

;) Endlich funktioniert es! Es zeigt das Hauptlayout ... aber ich habe diese MOOC-Übung verfolgt und es scheint, dass ich es nicht gut gemacht habe (die Firebase & Butterknife Version wurde aktualisiert ...) Danke für alles! –

Antwort

-1

Ich verweise auf das Tutorial unter ButterKnife tutorial. Ich denke, anstatt mit @BindView sollte es

@Bind(R.id.button) 
Button button; 
@Bind(R.id.textView) 
TextView textView; 
@Bind(R.id.radioButton) 
RadioButton radioButton; 
@Bind(R.id.checkBox) 
+1

** Bind ** ist "Veraltet", heutzutage ist ** BindView ** ... –

1

Erste @Bind werden, here ist eine meiner Antworten, die ich richtig einrichten butter geteilt.

dieses mögliche Problem vor:

Was du hier Aufschalten?

@Override //this line here 
@OnClick(R.id.signUp) 
public void handleSignUp() { 
    loginPresenter.registerNewUser(inputEmail.getText().toString(), 
     inputPassword.getText().toString()); 
} 

@Override //this line here 
@OnClick(R.id.signIn) 
public void handleSignIn() { 
    loginPresenter.validateLogin(inputEmail.getText().toString(), 
     inputPassword.getText().toString()); 
} 

Versuchen Sie stattdessen, ohne dass die Überschreibungen:

@OnClick(R.id.signUp) 
public void handleSignUp() { 
    loginPresenter.registerNewUser(inputEmail.getText().toString(), 
     inputPassword.getText().toString()); 
} 


@OnClick(R.id.signIn) 
public void handleSignIn() { 
    loginPresenter.validateLogin(inputEmail.getText().toString(), 
     inputPassword.getText().toString()); 
} 

reinigen Sie dann Ihr Projekt und wieder laufen!

Ich hoffe, das hilft!

+0

Tut mir leid, aber es funktioniert immer noch nicht ... Ich benutze eine Schnittstelle, wie Sie im gesamten Code meines gegeben sehen können Link, ich habe ein paar Zeilen über Gradle (über Buttermesser) hinzugefügt, dank Ihrer Antwort, aber immer noch, was passiert ... –

+0

Interfaces in einer Klasse verwendet nicht wirklich für alles (Methode) Sie haben. Sie müssen nur die Schnittstellenmethoden außer Kraft setzen. Können Sie die Fehlerprotokolle bitte posten? Zeigen Sie mir auch Ihre Gradle-Datei – Eenvincible

+0

Protokolle werden geschrieben, danke –