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

Android按钮需点击两次才触发onClickListener问题求助

问题原因分析

核心问题在于Firebase Firestore的get()查询是异步操作——它不会阻塞主线程等待结果,而是在后台完成查询后,通过addOnSuccessListener回调返回数据。

你当前的代码逻辑存在时序错误:

  1. 点击按钮调用checkUser,发起异步查询
  2. 立刻执行if (account != null)判断,但此时查询还未完成,account仍为null,所以不会触发跳转
  3. 第一次点击后,异步查询完成,account被赋值
  4. 第二次点击按钮时,account已有值,才会执行跳转逻辑
修复方案

将页面跳转逻辑移到addOnSuccessListener内部,确保只有当异步查询完成且验证通过后,才执行跳转:

修改后的checkUser函数

private void checkUser(View v){
    String emailString = String.valueOf(email.getText());
    String passwordString = String.valueOf(password.getText());
    
    db.getCOLLECTION_ACCOUNT().whereEqualTo(DatabaseConstants.KEY_ACCOUNT_EMAIL, emailString)
        .get().addOnSuccessListener(queryDocumentSnapshots -> {
            List<DocumentSnapshot> document = queryDocumentSnapshots.getDocuments();
            if(document.size()==1) {
                String pwCheck = (String) document.get(0).get(DatabaseConstants.KEY_ACCOUNT_PASSWORD);
                if (passwordString.equals(pwCheck)) {
                    Account account = document.get(0).toObject(Account.class);
                    // 查询验证通过后直接跳转
                    Routing.dashboardActivity(Login.this, account);
                } else {
                    // 密码不匹配提示
                    Toast.makeText(Login.this, "密码错误", Toast.LENGTH_SHORT).show();
                }
            } else {
                // 未找到用户提示
                Toast.makeText(Login.this, "该邮箱未注册", Toast.LENGTH_SHORT).show();
            }
        }).addOnFailureListener(e -> {
            Toast.makeText(Login.this, Testi.toastError, Toast.LENGTH_SHORT).show();
            Log.e(TAG, e.toString());
        });
}

修改后的按钮点击监听器

accedi.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        checkUser(view);
        // 移除原有的if判断,跳转逻辑已移至checkUser内部
    }
});
额外建议
  • 防止重复点击:点击按钮后立刻禁用按钮,查询完成后再恢复,避免用户多次触发重复请求
  • 密码安全优化:不要明文存储用户密码,建议存储哈希值(如SHA-256)或直接使用Firebase Auth自带的认证系统
  • 加载状态提示:查询过程中显示加载框(如ProgressDialog),提升用户体验

内容的提问来源于stack exchange,提问作者AleC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:42:48