Java 对Android Studio中编写的应用程序使用EditText时应用程序崩溃
我在尝试从Android中的“EditText”获取数据时遇到了一个问题。 当我尝试将“EditText”值分配给字符串变量(我使用了toString()方法)时,应用程序立即崩溃 问题在于onCreate方法之后的两行 这是我的密码: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
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
您不能像以前那样在方法之外编写代码。请不要在问题的标题中添加标记。此外,请在发布前仔细阅读标签使用指南。不客气。如果我的答案解决了您的问题,请将我的答案标记为解决方案!