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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:24:34