Android应用登录注册页点击按钮无法跳转至下一Activity问题求助
问题排查及修复方案
1. 注册逻辑错误及修复
当前注册逻辑存在路径不匹配、用户存在性判断逻辑完全错误的问题:
- 错误点:你查询的是固定路径
Users/Users details的文档,和实际存储用户数据的路径Users/[用户名]完全不一致,永远无法正确判断用户是否已存在 - 修复代码:
// 注册Activity的onCreate里点击事件修改 sign_Up.setOnClickListener(view -> { String name = edit_name.getText().toString().trim(); String password = edit_password.getText().toString().trim(); // 空值判断避免空指针 if(name.isEmpty() || password.isEmpty()){ Toast.makeText(sign_up.this, "用户名或密码不能为空", Toast.LENGTH_LONG).show(); return; } // 直接查询对应用户名的文档 db.collection("Users").document(name).get() .addOnSuccessListener(documentSnapshot -> { if(documentSnapshot.exists()){ Toast.makeText(sign_up.this, "该用户已存在,请重试", Toast.LENGTH_LONG).show(); }else{ Map<String, Object> users = new HashMap<>(); users.put(KEY_NAME,name); users.put(KEY_PASSWORD, password); db.collection("Users").document(name).set(users) .addOnSuccessListener(unused -> { Toast.makeText(sign_up.this,"注册成功",Toast.LENGTH_LONG).show(); Intent i = new Intent(sign_up.this,sum_selection.class); startActivity(i); }); } }) .addOnFailureListener(e -> { Toast.makeText(sign_up.this, "发生错误",Toast.LENGTH_LONG).show(); Log.d(TAG,e.toString()); }); });
2. 登录逻辑错误及修复
登录逻辑存在3个致命问题:
- 未初始化
user_name、user_password控件,直接调用会触发空指针崩溃 - 仍查询固定路径
Users/users details的文档,无法匹配到实际存储的用户数据 - Toast中直接拼接控件对象
user_name,没有取输入的字符串,会触发类型转换异常 - 修复代码:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.login); // 补上控件初始化,替换为你布局中对应的id user_name = findViewById(R.id.edit_login_name); user_password = findViewById(R.id.edit_login_password); sign_in = findViewById(R.id.btn_sign_in); sign_in.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String inputName = user_name.getText().toString().trim(); String inputPwd = user_password.getText().toString().trim(); if(inputName.isEmpty() || inputPwd.isEmpty()){ Toast.makeText(log_in.this, "用户名或密码不能为空", Toast.LENGTH_LONG).show(); return; } // 查询对应用户名的文档 database.collection("Users").document(inputName).get() .addOnSuccessListener(documentSnapshot -> { if(documentSnapshot.exists()){ // 匹配密码 String correctPwd = documentSnapshot.getString(KEY_PASSWORD); if(inputPwd.equals(correctPwd)){ Toast.makeText(log_in.this,"欢迎回来"+ inputName, Toast.LENGTH_LONG).show(); Intent in = new Intent(log_in.this, sum_selection.class); startActivity(in); }else{ Toast.makeText(log_in.this, "密码错误", Toast.LENGTH_LONG).show(); } } else { Toast.makeText(log_in.this, "用户不存在", Toast.LENGTH_LONG).show(); } }) .addOnFailureListener(e -> { Log.d(TAG, e.toString()); Toast.makeText(log_in.this, "登录失败:"+e.getMessage(), Toast.LENGTH_LONG).show(); }); } }); }
其他注意事项
- 所有输入框取内容前要先判空,避免空指针
- 确认Firestore控制台已经开启了对应路径的读写权限,否则会触发权限拒绝异常
内容的提问来源于stack exchange,提问作者DG fortuin
相关产品推荐
相关产品推荐

