Firebase登录/注册按钮无响应跳转失效问题求助(附代码)
问题排查与解决
核心问题出在LoginActivity的登录逻辑错误:你在登录功能里调用了createUserWithEmailAndPassword()(创建用户的API),而不是登录专用的signInWithEmailAndPassword()。
当你用已注册的邮箱密码调用createUserWithEmailAndPassword()时,Firebase会返回"邮箱已存在"的错误,导致task.isSuccessful为false,所以不会执行跳转和成功Toast,但因为你没有在失败回调里打印错误信息,所以看不到提示,看起来像是按钮无响应。你看到的数据上传到Firebase,应该是测试注册功能时创建的用户,登录操作并没有创建新用户,只是执行失败了。
修正后的LoginActivity代码
class LoginActivity : AppCompatActivity() { private lateinit var auth: FirebaseAuth override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) auth = Firebase.auth val signuplinkbtn = findViewById<Button>(R.id.signup_link_btn) signuplinkbtn.setOnClickListener { startActivity(Intent(this, RegisterActivity::class.java)) } val loginButton = findViewById<Button>(R.id.login_btn) loginButton.setOnClickListener { performLogin() } } private fun performLogin() { val email = findViewById<EditText>(R.id.email_login) val password = findViewById<EditText>(R.id.password_login) if (email.text.isEmpty() || password.text.isEmpty()) { Toast.makeText(this, "Please, fill all fields", Toast.LENGTH_LONG).show() return } val emailInput = email.text.toString() val passwordInput = password.text.toString() // 替换为登录专用API auth.signInWithEmailAndPassword(emailInput, passwordInput) .addOnCompleteListener(this) { task -> if (task.isSuccessful) { val intent = Intent(this, MainActivity::class.java) startActivity(intent) Toast.makeText(baseContext, "Success", Toast.LENGTH_SHORT).show() // 可选:结束当前Activity,避免返回登录页 finish() } else { // 打印错误信息,方便调试 task.exception?.let { Toast.makeText(baseContext, "Authentication failed: ${it.message}", Toast.LENGTH_SHORT).show() } } } .addOnFailureListener { Toast.makeText(this, "Error occured: ${it.message}", Toast.LENGTH_LONG).show() } } }
额外检查项
- RegisterActivity逻辑正确,但建议在成功跳转后调用
finish(),避免用户返回注册页。 - 确认
MainActivity已在AndroidManifest.xml中正确注册:<activity android:name=".MainActivity" /> - 确保Firebase项目配置正确,
google-services.json文件已放置在app目录下。 - 建议使用ViewBinding替代
findViewById,减少代码冗余并避免ID错误:
在build.gradle(app)中启用:
然后在Activity中使用:android { buildFeatures { viewBinding true } }private lateinit var binding: ActivityLoginBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityLoginBinding.inflate(layoutInflater) setContentView(binding.root) // 通过binding直接调用视图:binding.emailLogin, binding.passwordLogin等 }
内容的提问来源于stack exchange,提问作者yves
相关产品推荐
相关产品推荐

