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>
错误分析
密码验证失败的核心原因有两个:
方法参数顺序不匹配
调用createAccount时传入的参数顺序是user, email, pass, repass,但方法定义的参数顺序是user, pass, repass, email——这导致实际参与比较的pass变量是传入的email值,repass是传入的pass值,两者自然不相等,触发验证错误。控件ID引用错误
按钮点击事件中使用ed_pass、ed_repass获取输入内容,但布局文件中对应的密码输入框ID是ed_password_from_create_acc、ed_repassword_from_create_acc,控件引用不匹配会导致获取到空值或错误内容,进一步引发验证失败。额外优化点
密码输入框的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
相关产品推荐
相关产品推荐

