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

Android Studio中密码与确认密码输入相同仍验证失败问题排查

密码验证失败问题排查与修复

问题说明

开发注册功能时,输入完全相同的密码和确认密码,却始终触发"Password tidak sama"(密码不一致)的验证错误,相关代码如下:

按钮点击事件代码

btn_kirim.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            user = ed_username.getText().toString();
            email = ed_email.getText().toString();
            pass = String.valueOf(ed_pass.getEditText().getText());
            repass = String.valueOf(ed_repass.getEditText().getText());
            createAccount(user, email, pass, repass, database,fAuth);
        }
    });

密码验证逻辑代码

private void createAccount(String user, String pass, String repass, String email, DatabaseReference database2, FirebaseAuth fAuth) {
    if (user.isEmpty() || pass.isEmpty() || repass.isEmpty() || email.isEmpty()){
        Toast.makeText(getApplicationContext(),
                "Data belum lengkap",Toast.LENGTH_SHORT).show();
    } else if (!pass.equals(repass)) {
        Toast.makeText(getApplicationContext(),
                "Password tidak sama",Toast.LENGTH_SHORT).show();
    }else{
        fAuth.createUserWithEmailAndPassword(email,pass)
                .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()){
                            Toast.makeText(CreateAccountPage.this, "Register Successfull", Toast.LENGTH_SHORT).show();
                        }else{
                            Toast.makeText(CreateAccountPage.this, "Error!!" + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                        }
                    }
                });

        //Menambahkan data ke real-time database firebase
        database2 = FirebaseDatabase.getInstance().getReference("users");
        database2.child(user).child("username").setValue(user);
        Toast.makeText(getApplicationContext(),
                "Register berhasil",Toast.LENGTH_SHORT).show();
        startActivity(new Intent(CreateAccountPage.this, LoginPage.class));
    }
}

布局XML密码相关片段

<com.google.android.material.textfield.TextInputLayout
    android:id="@+id/layout_textPassword"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:passwordToggleEnabled="true">
    <com.google.android.material.textfield.TextInputEditText
        android:id="@+id/ed_password_from_create_acc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginEnd="60dp"
        android:hint="Password"
        android:inputType="text"
        tools:ignore="HardcodedText" />
</com.google.android.material.textfield.TextInputLayout>

<com.google.android.material.textfield.TextInputLayout
    android:id="@+id/layout_textRepassword"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:passwordToggleEnabled="true">
    <com.google.android.material.textfield.TextInputEditText
        android:id="@+id/ed_repassword_from_create_acc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginEnd="60dp"
        android:hint="Password"
        android:inputType="text"
        tools:ignore="HardcodedText" />
</com.google.android.material.textfield.TextInputLayout>

错误分析

密码验证失败的核心原因有两个:

  1. 方法参数顺序不匹配
    调用createAccount时传入的参数顺序是user, email, pass, repass,但方法定义的参数顺序是user, pass, repass, email——这导致实际参与比较的pass变量是传入的email值,repass是传入的pass值,两者自然不相等,触发验证错误。

  2. 控件ID引用错误
    按钮点击事件中使用ed_pass、ed_repass获取输入内容,但布局文件中对应的密码输入框ID是ed_password_from_create_acc、ed_repassword_from_create_acc,控件引用不匹配会导致获取到空值或错误内容,进一步引发验证失败。

  3. 额外优化点
    密码输入框的inputType设置为text,应该改为textPassword,既符合密码输入的交互规范,也能避免潜在的输入格式问题。

修正后的代码

修正按钮点击事件(参数顺序+控件ID)

btn_kirim.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            user = ed_username.getText().toString();
            email = ed_email.getText().toString();
            // 修正控件ID引用
            pass = String.valueOf(ed_password_from_create_acc.getText());
            repass = String.valueOf(ed_repassword_from_create_acc.getText());
            // 修正参数顺序,匹配方法定义
            createAccount(user, pass, repass, email, database,fAuth);
        }
    });

修正布局中的密码输入类型

将两个密码输入框的android:inputType="text"改为:

android:inputType="textPassword"

额外优化:Firebase认证逻辑

原代码中不管Firebase认证是否成功,都会直接跳转页面,建议将数据库写入、Toast提示和页面跳转逻辑移到认证成功的回调中:

fAuth.createUserWithEmailAndPassword(email,pass)
        .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()){
                    Toast.makeText(CreateAccountPage.this, "Register Successfull", Toast.LENGTH_SHORT).show();
                    // 认证成功后再写入数据库
                    database2 = FirebaseDatabase.getInstance().getReference("users");
                    database2.child(user).child("username").setValue(user);
                    Toast.makeText(getApplicationContext(),
                            "Register berhasil",Toast.LENGTH_SHORT).show();
                    startActivity(new Intent(CreateAccountPage.this, LoginPage.class));
                }else{
                    Toast.makeText(CreateAccountPage.this, "Error!!" + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                }
            }
        });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 01:42:04