Android Studio如何实现EditText为空时禁用按钮 解决空输入登录崩溃
问题修复方案
应用崩溃、登录按钮禁用失效的核心原因有3点:
- 未对输入框内容做非空校验,直接将空字符串传入Firebase登录方法,触发参数非法异常
- 登录失败回调中未对
task.getException()做判空处理,极端场景下会触发空指针崩溃 - 未给输入框绑定内容变化监听,无法根据输入状态实时更新登录按钮的可用状态
第一步:修复点击空输入时的崩溃问题
在登录按钮的点击逻辑中,先获取输入内容做去空格处理,校验为空时直接给对应输入框弹出错误提示,终止登录流程,不要弹出加载框、不要调用Firebase登录接口。
修改后的登录按钮点击逻辑代码如下:
binding.submitBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String email, pass; // 取输入内容时同时去掉首尾空格 email = binding.emailBox.getText().toString().trim(); pass = binding.passwordBox.getText().toString().trim(); // 非空校验 if (TextUtils.isEmpty(email)) { binding.emailBox.setError("请输入邮箱地址"); binding.emailBox.requestFocus(); return; } if (TextUtils.isEmpty(pass)) { binding.passwordBox.setError("请输入登录密码"); binding.passwordBox.requestFocus(); return; } dialog.show(); auth.signInWithEmailAndPassword(email, pass).addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { dialog.dismiss(); if(task.isSuccessful()) { startActivity(new Intent(LoginActivity.this, MainActivity.class)); finish(); } else { // 先判空再取异常信息,避免空指针 String errorMsg = "登录失败,请稍后重试"; if (task.getException() != null) { errorMsg = task.getException().getLocalizedMessage(); } Toast.makeText(LoginActivity.this, errorMsg, Toast.LENGTH_SHORT).show(); } } }); } });
注意:使用TextUtils需要先导入包import android.text.TextUtils;
第二步:实现输入为空时自动禁用登录按钮
在onCreate方法中,给两个输入框添加文本变化监听器,每次输入内容变化时都校验两个输入框是否都有有效内容,动态设置登录按钮的可用状态:
// 初始化时先默认禁用登录按钮 binding.submitBtn.setEnabled(false); // 给按钮设置禁用状态的透明度,方便用户识别状态 binding.submitBtn.setAlpha(0.5f); // 文本变化监听逻辑 TextWatcher loginTextWatcher = new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { String email = binding.emailBox.getText().toString().trim(); String pass = binding.passwordBox.getText().toString().trim(); // 两个输入框都非空时启用按钮,否则禁用 boolean canSubmit = !TextUtils.isEmpty(email) && !TextUtils.isEmpty(pass); binding.submitBtn.setEnabled(canSubmit); binding.submitBtn.setAlpha(canSubmit ? 1f : 0.5f); } @Override public void afterTextChanged(Editable s) {} }; // 给两个输入框绑定监听器 binding.emailBox.addTextChangedListener(loginTextWatcher); binding.passwordBox.addTextChangedListener(loginTextWatcher);
使用TextWatcher需要导入包import android.text.TextWatcher;
把上面两段代码替换到你原有onCreate方法的对应位置即可,修改后:
- 输入框为空时登录按钮默认是灰色不可点击状态,从根源上避免空参数提交
- 即使绕过按钮状态触发点击,非空校验也会拦截请求,不会出现崩溃
- 登录失败时不会因为异常为空触发二次崩溃
内容的提问来源于stack exchange,提问作者Nedal ed
相关产品推荐
相关产品推荐

