Java 对Android Studio中编写的应用程序使用EditText时应用程序崩溃

Java 对Android Studio中编写的应用程序使用EditText时应用程序崩溃,java,android,Java,Android,我在尝试从Android中的“EditText”获取数据时遇到了一个问题。 当我尝试将“EditText”值分配给字符串变量(我使用了toString()方法)时,应用程序立即崩溃 问题在于onCreate方法之后的两行 这是我的密码: public class MainActivity extends AppCompatActivity { EditText em; EditText pw; private FirebaseAuth mAuth; @Override protected v

我在尝试从Android中的“EditText”获取数据时遇到了一个问题。 当我尝试将“EditText”值分配给字符串变量(我使用了toString()方法)时,应用程序立即崩溃

问题在于onCreate方法之后的两行

这是我的密码:

public class MainActivity extends AppCompatActivity {

EditText em;
EditText pw;
private FirebaseAuth mAuth;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    EditText em = (EditText) findViewById(R.id.email1);
    EditText pw = (EditText) findViewById(R.id.password1);

    mAuth = FirebaseAuth.getInstance();
}

// When I remove those two lines the app runs normally
String email = em.getText().toString(); 
String password = pw.getText().toString();



void login(View v){
    mAuth.signInWithEmailAndPassword(email, password)
            .addOnCompleteListener(MainActivity.this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        FirebaseUser user = mAuth.getCurrentUser();
                        String Logged = user.getEmail().toString();

                        Intent intent = new Intent(MainActivity.this, afterLogin.class);
                        intent.putExtra("email", Logged);
                        startActivity(intent);
                        finish();

                    } else {
                        // If sign in fails, display a message to the user.

                        Toast.makeText(MainActivity.this, "Wrong email/password.", Toast.LENGTH_SHORT).show();

                    }

                }
            });
}
public类MainActivity扩展了AppCompatActivity{
编辑文本em;
编辑文本pw;
私人消防队;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText em=(EditText)findViewById(R.id.email1);
EditText pw=(EditText)findViewById(R.id.password1);
mAuth=FirebaseAuth.getInstance();
}
//当我删除这两行时,应用程序会正常运行
字符串email=em.getText().toString();
字符串密码=pw.getText().toString();
无效登录(视图v){
mAuth.使用电子邮件和密码登录(电子邮件,密码)
.addOnCompleteListener(MainActivity.this,新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
//登录成功,使用登录用户的信息更新UI
FirebaseUser=mAuth.getCurrentUser();
记录的字符串=user.getEmail().toString();
意向意向=新意向(MainActivity.this,afterLogin.class);
intent.putExtra(“电子邮件”,已记录);
星触觉(意向);
完成();
}否则{
//如果登录失败,则向用户显示消息。
Toast.makeText(MainActivity.this,“错误的电子邮件/密码”,Toast.LENGTH_SHORT.show();
}
}
});
}

}为什么这些声明都在外面

String email = em.getText().toString(); 
String password = pw.getText().toString();  
您正在尝试在执行onCreate之前分配这些。 在类级别提取数据类似于在构造函数中这样做。 想想看。。构造函数首先运行,然后执行onCreate

所以,你基本上是在跑步

null.getText().toString(); //because em and pw were still null

不要这样做,请将这些语句移动到login方法或您可能想要创建的任何其他事件方法。

您在
onCreate
之前声明并初始化
字符串电子邮件
字符串密码
,因此
编辑文本
为空。将
字符串
初始化移动到
onCreate中,如下所示:

EditText em;
EditText pw;
String email;
String password;

onCreate {
  EditText em = findViewById(R.id.email1);
  EditText pw = findViewById(R.id.password1);

  email = em.getText().toString;
  password = pw.getText().toString;
}

当然,
EditText
s此时可能为空,因此您可能希望稍后获取它们的值,或者使用
TextWatcher

您不能像以前那样在方法之外编写代码。请不要在问题的标题中添加标记。此外,请在发布前仔细阅读标签使用指南。不客气。如果我的答案解决了您的问题,请将我的答案标记为解决方案!