2017-03-27 42 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中初始化所有视图。

相关问题