Android实现PIN校验AlertDialog点击确认按钮崩溃如何解决
崩溃原因
点击OK按钮直接崩溃是触发了空指针异常,原有代码还存在逻辑缺陷:
- 核心崩溃点:
pin_text是自定义布局password_dialog里的EditText控件,你没有通过inflate得到的view对象获取控件实例,直接调用时控件引用为空,直接崩溃。 - 隐含逻辑问题:AlertDialog默认点击正负按钮都会自动关闭对话框,就算解决空指针,输入错误PIN时对话框会直接消失,你写的错误提示、输入框重聚焦逻辑根本不会生效。
修复代码
private fun passwordCheck(position: Int){ // 加载自定义布局,获取输入框实例 val dialogView = LayoutInflater.from(requireContext()).inflate(R.layout.password_dialog, null, false) val pinInput = dialogView.findViewById<EditText>(R.id.pin_text) val builder = AlertDialog.Builder(requireContext()) lateinit var alertDialog: AlertDialog with(builder) { setTitle("Enter your Pin") setCancelable(false) setNegativeButton("Cancel") { dialog, _ -> dialog.dismiss() } setView(dialogView) alertDialog = show() // 重写确认按钮点击逻辑,覆盖默认自动关闭对话框的行为 alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).apply { text = "Ok" setOnClickListener { val inputContent = pinInput.text.toString() if (inputContent == "1234") { Toast.makeText(requireContext(), "Right Pin", Toast.LENGTH_LONG).show() // PIN校验通过,执行后续业务逻辑后关闭对话框 alertDialog.dismiss() } else { pinInput.requestFocus() pinInput.error = "Incorrect" // 校验不通过不关闭对话框,停留在当前页等待重新输入 } } } } }
关键改动说明
- 通过
findViewById从加载的自定义布局中拿到输入框实例,从根源解决空指针问题。如果项目接入了ViewBinding,可直接用视图绑定对象获取控件,避免手写id匹配错误。 - 不在
setPositiveButton的回调中写校验逻辑,等对话框显示完成后,单独给确认按钮设置点击监听,覆盖默认点击即关闭的逻辑:只有PIN校验通过时才主动调用dismiss()关闭对话框,校验失败时保留对话框,正常展示错误提示。 - 每次点击确认按钮时实时获取输入框的最新内容,避免提前缓存文本导致的内容不同步问题。
内容的提问来源于stack exchange,提问作者Dibya Ranjan
相关产品推荐
相关产品推荐

