You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)中启用:
    android {
        buildFeatures {
            viewBinding true
        }
    }
    
    然后在Activity中使用:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:25:03