2017-03-27 38 views
-1

您好,我對java和android開發人員瞭解得很充分,但是這個錯誤給了我三個星期的麻煩。我已經嘗試了所有關於堆棧溢出的解決方案,例如更改我初始化editText變量的方式,但仍然沒有運氣。任何幫助將不勝感激,因爲它看起來好像應該沒有任何錯誤。java.lang.NullPointerException:嘗試調用null對象上的虛擬方法'android.text.Editable android.widget.EditText.getText()'2017

這裏是我的MainActivity類別代碼:

'公共類MainActivity擴展AppCompatActivity實現View.OnClickListener {

private FirebaseAuth mAuth; 
private FirebaseAuth.AuthStateListener mAuthListener; 
public String email; 
public String password; 
private EditText emailedittext; 
private EditText passwordedittext; 
private TextView mStatusTextView; 
private TextView mDetailTextView; 
private static final String TAG = "EmailPassword"; 
SharedPreferences sharedpref; 
private SharedPreferences.Editor loginStateEditor; 
ProgressDialog progressdialog; 
Handler handler = new Handler(); 
int status = 0; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET); 
    Fabric.with(this, new Twitter(authConfig)); 
    setContentView(R.layout.activity_main); 

    EditText emailedittext = (EditText)findViewById(R.id.emailedittext); 
    EditText passwordedittext = (EditText)findViewById(R.id.passwordedittext); 
    final TextView mStatusTextView = (TextView) findViewById(R.id.mStatus); 
    TextView mDetailTextView = (TextView) findViewById(R.id.mDetail); 

    Button loginbutton = (Button)findViewById(R.id.login); 
    Button signupbutton = (Button)findViewById(R.id.signup); 
    Button signoutbutton = (Button)findViewById(R.id.signout); 

    findViewById(R.id.login).setOnClickListener(this); 
    findViewById(R.id.signup).setOnClickListener(this); 
    findViewById(R.id.signout).setOnClickListener(this); 

    CreateProgressDialog(); 



    sharedpref = getSharedPreferences("myPref", Context.MODE_PRIVATE); 
    loginStateEditor = sharedpref.edit(); 

    if (sharedpref.getBoolean("success_login", false)) { 
     // Start Your Menu Activity 
     Intent i = new Intent(MainActivity.this, Menu.class); 
     i.putExtra(EXTRA_MESSAGE, email); 
     i.putExtra(EXTRA_MESSAGE, password); 
     startActivity(i); 

     mAuth = FirebaseAuth.getInstance(); 
     mAuthListener = new FirebaseAuth.AuthStateListener() { 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
       FirebaseUser user = firebaseAuth.getCurrentUser(); 
       if (user != null) { 
        // User is signed in 
        Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid()); 
        Intent i = new Intent(MainActivity.this, Menu.class); 
        i.putExtra(EXTRA_MESSAGE, email); 
        i.putExtra(EXTRA_MESSAGE, password); 
        startActivity(i); 
       } else { 
        // User is signed out 
        Log.d(TAG, "onAuthStateChanged:signed_out"); 
       } 
       updateUI(user); 
      } 


     };}} 

@SuppressLint("StringFormatInvalid") 
private void updateUI(FirebaseUser user) { 

    final TextView mStatusTextView = (TextView) findViewById(R.id.mStatus); 
    TextView mDetailTextView = (TextView) findViewById(R.id.mDetail); 

    Button loginbutton = (Button)findViewById(R.id.login); 
    Button signupbutton = (Button)findViewById(R.id.signup); 
    Button signoutbutton = (Button)findViewById(R.id.signout); 

    findViewById(R.id.login).setOnClickListener(this); 
    findViewById(R.id.signup).setOnClickListener(this); 
    findViewById(R.id.signout).setOnClickListener(this); 

    hideProgressDialog();{ 
    if (user != null) { 
     mStatusTextView.setText(getString(R.string.emailpassword_status_fmt, user.getEmail())); 
     mDetailTextView.setText(getString(R.string.firebase_status_fmt, user.getUid())); 


     this.findViewById(R.id.login).setVisibility(View.GONE); 
     this.findViewById(R.id.signup).setVisibility(View.GONE); 
     this.findViewById(R.id.mStatus).setVisibility(View.GONE); 
     this.findViewById(R.id.mDetail).setVisibility(View.GONE); 
     this.findViewById(R.id.signout).setVisibility(View.VISIBLE); 
    } else { 
     mStatusTextView.setText(R.string.signed_out); 
     mDetailTextView.setText(null); 


     this.findViewById(R.id.login).setVisibility(View.VISIBLE); 
     this.findViewById(R.id.signup).setVisibility(View.VISIBLE); 
     this.findViewById(R.id.mStatus).setVisibility(View.GONE); 
     this.findViewById(R.id.mDetail).setVisibility(View.GONE); 
     this.findViewById(R.id.signout).setVisibility(View.GONE); 
    } 

    } 

} 





private void createAccount(final String email, final String password){ 
    Log.d(TAG, "createAccount:" + email); 
    if (!validateForm()) { 
     return; 
    } 

    showProgressDialog(); 

    mAuth.createUserWithEmailAndPassword(email, password) 
      .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
        Log.d(TAG, "createUserWithEmail:onComplete:" + task.isSuccessful()); 

        // If sign in fails, display a message to the user. If sign in succeeds 
        // the auth state listener will be notified and logic to handle the 
        // signed in user can be handled in the listener. 
        if (!task.isSuccessful()) { 
         Toast.makeText(MainActivity.this, "Authentication failed.", 
           Toast.LENGTH_SHORT).show(); 
         loginStateEditor.putBoolean("success_login", true); 
         loginStateEditor.commit(); 

         Intent i = new Intent(MainActivity.this, Menu.class); 
         i.putExtra(EXTRA_MESSAGE, email); 
         i.putExtra(EXTRA_MESSAGE, password); 
         startActivity(i); 
        } 
        hideProgressDialog(); 


        loginStateEditor.putBoolean("success_login", true); 
        loginStateEditor.commit(); 

        Intent i = new Intent(MainActivity.this, Menu.class); 
        startActivity(i); 
       } 


      }); 
} 

private void hideProgressDialog() { 

    progressdialog.dismiss(); 

} 


private boolean validateForm() { 
    boolean valid = true; 


    String email = emailedittext.getText().toString(); 
    if (TextUtils.isEmpty(email)) { 
     emailedittext.setError("Required."); 
     valid = false; 
    } else { 
     emailedittext.setError(null); 
    } 


    String password = passwordedittext.getText().toString(); 
    if (TextUtils.isEmpty(password)) { 
     passwordedittext.setError("Required."); 
     valid = false; 
    } else { 
     passwordedittext.setError(null); 
    } 
    return valid; 
} 

public void showProgressDialog() { 
    status = 0; 

    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      while(status < 100){ 

       status +=1; 

       try{ 
        Thread.sleep(200); 
       }catch(InterruptedException e){ 
        e.printStackTrace(); 
       } 

       handler.post(new Runnable() { 
        @Override 
        public void run() { 

         progressdialog.setProgress(status); 

         if(status == 100){ 

          progressdialog.dismiss(); 
         } 
        } 
       }); 
      } 
     } 
    }).start(); 

} 







@Override 
public void onClick(View v) { 



    EditText emailedittext = (EditText)MainActivity.this.findViewById(R.id.emailedittext); 
    EditText passwordedittext = (EditText)MainActivity.this.findViewById(R.id.passwordedittext); 

    int i = v.getId(); 
    try { 
     if (i == R.id.signup && emailedittext.getText() != null && passwordedittext.getText() != null) { 

      createAccount(emailedittext.getText().toString(), passwordedittext.getText().toString()); 
      String email = emailedittext.getText().toString(); 
      String password = passwordedittext.getText().toString(); 


     } else if (i == R.id.login && emailedittext.getText() != null && passwordedittext.getText() != null) { 

      signIn(emailedittext.getText().toString(), passwordedittext.getText().toString()); 
      String email = emailedittext.getText().toString(); 
      String password = passwordedittext.getText().toString(); 

     } else if (i == R.id.signout) { 
      signOut(); 
     } 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 


public void CreateProgressDialog() 
{ 

    progressdialog = new ProgressDialog(MainActivity.this); 

    progressdialog.setIndeterminate(false); 

    progressdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 

    progressdialog.setCancelable(true); 

    progressdialog.setMax(100); 

    progressdialog.show(); 

} 




private void signIn(final String email, final String password){ 
    Log.d(TAG, "signIn:" + email); 
    if (!validateForm()) { 
     return; 
    } 

    showProgressDialog(); 

    mAuth.signInWithEmailAndPassword(email, password) 
      .addOnCompleteListener(MainActivity.this, new OnCompleteListener<com.google.firebase.auth.AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
        Log.d(TAG, "signInWithEmail:onComplete:" + task.isSuccessful()); 

        // If sign in fails, display a message to the user. If sign in succeeds 
        // the auth state listener will be notified and logic to handle the 
        // signed in user can be handled in the listener. 
        if (!task.isSuccessful()) { 
         onSuccess(); 
         { 
          Log.w(TAG, "signInWithEmail", task.getException()); 
          Toast.makeText(MainActivity.this, "Authentication failed.", 
            Toast.LENGTH_SHORT).show(); 

          loginStateEditor.putBoolean("success_login", true); 
          loginStateEditor.commit(); 
          Intent i = new Intent(MainActivity.this, Menu.class); 
          i.putExtra(EXTRA_MESSAGE, email); 
          i.putExtra(EXTRA_MESSAGE, password); 
          startActivity(i); 
         } 
         if (!task.isSuccessful()) { 
          mStatusTextView.setText(R.string.auth_failed); 
         } 
         hideProgressDialog(); 

        } 


       } 
      }); 

} 


FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 

{ 
    if (user != null) { 
     // Name, email address, and profile photo Url 
     String name = user.getDisplayName(); 
     String email = user.getEmail(); 
     Uri photoUrl = user.getPhotoUrl(); 


     // The user's ID, unique to the Firebase project. Do NOT use this value to 
     // authenticate with your backend server, if you have one. Use 
     // FirebaseUser.getToken() instead. 
     String uid = user.getUid(); 
    } 

} 






private void signOut() { 
    mAuth.signOut(); 
    updateUI(null); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
} 

public void onSuccess(){ 
    sharedpref.getBoolean("success_login", true); 
    loginStateEditor.commit(); 
    Intent i = new Intent(MainActivity.this, Menu.class); 
    i.putExtra(EXTRA_MESSAGE, email); 
    i.putExtra(EXTRA_MESSAGE, password); 
    startActivity(i); 
} 

} `

下面是導致該錯誤的特定部分:

@Override 
public void onClick(View v) { 



    EditText emailedittext = (EditText)MainActivity.this.findViewById(R.id.emailedittext); 
    EditText passwordedittext = (EditText)MainActivity.this.findViewById(R.id.passwordedittext); 

    int i = v.getId(); 
    try { 
     if (i == R.id.signup && emailedittext.getText() != null && passwordedittext.getText() != null) { 

      createAccount(emailedittext.getText().toString(), passwordedittext.getText().toString()); 
      String email = emailedittext.getText().toString(); 
      String password = passwordedittext.getText().toString(); 


     } else if (i == R.id.login && emailedittext.getText() != null && passwordedittext.getText() != null) { 

      signIn(emailedittext.getText().toString(), passwordedittext.getText().toString()); 
      String email = emailedittext.getText().toString(); 
      String password = passwordedittext.getText().toString(); 

     } else if (i == R.id.signout) { 
      signOut(); 
     } 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

這裏是logcat:

ittouch W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference 
03-26 16:15:57.401 5772-5772/com.example.littouchinc.littouch W/System.err:  at com.example.littouchinc.littouch.MainActivity.validateForm(MainActivity.java:202) 
03-26 16:15:57.401 5772-5772/com.example.littouchinc.littouch W/System.err:  at com.example.littouchinc.littouch.MainActivity.createAccount(MainActivity.java:153) 
03-26 16:15:57.402 5772-5772/com.example.littouchinc.littouch W/System.err:  at com.example.littouchinc.littouch.MainActivity.onClick(MainActivity.java:242) 
03-26 16:15:57.402 5772-5772/com.example.littouchinc.littouch W/System.err:  at android.view.View.performClick(View.java:5610) 
03-26 16:15:57.402 5772-5772/com.example.littouchinc.littouch W/System.err:  at android.view.View$PerformClick.run(View.java:22265) 
03-26 16:15:57.402 5772-5772/com.example.littouchinc.littouch W/System.err:  at android.os.Handler.handleCallback(Handler.java:751) 
03-26 16:15:57.402 5772-5772/com.example.littouchinc.littouch W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
03-26 16:15:57.402 5772-5772/com.example.littouchinc.littouch W/System.err:  at android.os.Looper.loop(Looper.java:154) 
03-26 16:15:57.402 5772-5772/com.example.littouchinc.littouch W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:6077) 
03-26 16:15:57.402 5772-5772/com.example.littouchinc.littouch W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
03-26 16:15:57.402 5772-5772/com.example.littouchinc.littouch W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
03-26 16:15:57.402 5772-5772/com.example.littouchinc.littouch W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

任何幫助將不勝感激你。

+4

使用'emailedittext'而不是'EditText emailedittext',因爲您已經在類中聲明瞭具有相同名稱的EdiText。不需要在'onClick'方法中再次創建它。 'passwordedittext'做同樣的事情 –

回答

0
  1. 聲明所有ButtonEditTextTextView作爲全球。

    ............ 
    private EditText emailedittext; 
    private EditText passwordedittext; 
    private TextView mStatusTextView; 
    private TextView mDetailTextView; 
    private Button loginbutton; 
    private Button signupbutton; 
    private Button signoutbutton; 
    ......... 
    ............... 
    
  2. 更新活動OnCreate()方法:

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
    
        ................... 
        ...................... 
        emailedittext = (EditText) findViewById(R.id.emailedittext); 
        passwordedittext = (EditText) findViewById(R.id.passwordedittext); 
        mStatusTextView = (TextView) findViewById(R.id.mStatus); 
        mDetailTextView = (TextView) findViewById(R.id.mDetail); 
    
        loginbutton = (Button) findViewById(R.id.login); 
        signupbutton = (Button) findViewById(R.id.signup); 
        signoutbutton = (Button) findViewById(R.id.signout); 
    
        loginbutton .setOnClickListener(this); 
        signupbutton .setOnClickListener(this); 
        signoutbutton .setOnClickListener(this); 
        ................. 
        ...................... 
    } 
    
  3. 更新您的updateUI()方法:

    @SuppressLint("StringFormatInvalid")  
    private void updateUI(FirebaseUser user) { 
    
    hideProgressDialog(); 
    
    if (user != null) { 
        mStatusTextView.setText(getString(R.string.emailpassword_status_fmt,  user.getEmail())); 
        mDetailTextView.setText(getString(R.string.firebase_status_fmt, user.getUid())); 
    
    
        loginbutton.setVisibility(View.GONE); 
        signupbutto.setVisibility(View.GONE); 
        mStatusTextView.setVisibility(View.GONE); 
        mDetailTextView.setVisibility(View.GONE); 
        signoutbutton.setVisibility(View.VISIBLE); 
    } else { 
        mStatusTextView.setText(R.string.signed_out); 
        mDetailTextView.setText(null); 
    
        loginbutton.setVisibility(View.VISIBLE); 
        signupbutton.setVisibility(View.VISIBLE); 
        mStatusTextView.setVisibility(View.GONE); 
        mStatusTextView.setVisibility(View.GONE); 
        signoutbutton.setVisibility(View.GONE); 
    } 
    } 
    
  4. 更新onClick()方法:

    @Override 
    public void onClick(View v) { 
    
        int i = v.getId(); 
    
        try { 
         if (i == R.id.signup && emailedittext.getText() != null && passwordedittext.getText() != null) { 
    
          createAccount(emailedittext.getText().toString(), passwordedittext.getText().toString()); 
    
          String email = emailedittext.getText().toString(); 
          String password = passwordedittext.getText().toString(); 
         } else if (i == R.id.login && emailedittext.getText() != null && passwordedittext.getText() != null) { 
    
          signIn(emailedittext.getText().toString(), passwordedittext.getText().toString()); 
          String email = emailedittext.getText().toString(); 
          String password = passwordedittext.getText().toString(); 
         } else if (i == R.id.signout) { 
          signOut(); 
         } 
        }catch(Exception e){ 
        e.printStackTrace(); 
        } 
    } 
    

希望這會有所幫助!

+0

你是個天才!我不知道爲什麼,但如果你已經初始化了onCreate方法和全局變量中的小部件,再次初始化它將使參數爲空。非常感謝你提供這個解決方案,因爲我一直在這個問題上停留了三個星期。謝謝 – Jamar

+0

很高興知道它的工作原理:) – FAT

0

你爲什麼一次又一次地使用這些線?

EditText emailedittext = (EditText)findViewById(R.id.emailedittext); 
EditText passwordedittext = (EditText)findViewById(R.id.passwordedittext); 

EditText emailedittext,passworditext是已經聲明的變量。 因此,簡單地用

emailedittext = (EditText)findViewById(R.id.emailedittext); 
passwordedittext = (EditText)findViewById(R.id.passwordedittext); 

此外,從的onCreate()。你不需要在這裏定義它們像這樣的,因爲它們是在OnCreate中(已定義)

EditText emailedittext = (EditText)MainActivity.this.findViewById(R.id.emailedittext); 
    EditText passwordedittext = (EditText)MainActivity.this.findViewById(R.id.passwordedittext); 
0

錯誤信息刪除這些行說您嘗試在空對象上調用getText()。在MainActivity.java:202行之前檢查emailedittext或passwordedittext是否爲null。

0

有什麼特殊的原因,爲您添加下面幾行:

EditText emailedittext = (EditText)MainActivity.this.findViewById(R.id.emailedittext); 
EditText passwordedittext = (EditText)MainActivity.this.findViewById(R.id.passwordedittext); 

這些都不需要,你已經在OnCreate中初始化它們。它總是問題。第一次啓動應用程序時是否有效?如果它第一次工作並在暫停應用程序後崩潰,那麼最好在OnResume中初始化所有視圖。

相關問題