有时候AlertDialog带有逻辑判断,不符合条件的时候想继续显示对话框,但是点击了按钮默认是会关闭对话框的,又不想自定义Dialog,经研究测试,下面的方式可以达到预期效果:
fun AlertDialog.keep(text: String = "确定", listener: DialogInterface.OnClickListener? = null): AlertDialog {
getButton(DialogInterface.BUTTON_POSITIVE).let { positiveButton ->
positiveButton.visibility = View.VISIBLE
positiveButton.text = text
positiveButton.setOnClickListener {
listener?.onClick(this, DialogInterface.BUTTON_POSITIVE)
}
}
return this
}
调用的时候记得先 show() 再 keep()
private fun showPasswordDialog() {
val editText = EditText(this)
AlertDialog.Builder(this)
.setCancelable(false)
.setTitle("请输入密码")
.setView(editText)
// .setPositiveButton("确定", null)
.setNegativeButton("取消") { _, _ -> finish() }
.show().keep("确定") { dialog, _ ->
val pwd = editText.text.toString().trim().toByteArray()
if ((application as App).getPassword("XXX").contentEquals(pwd)) {
//密码正确,关闭对话框
dialog.dismiss()
} else {
showToastOnUI("密码错误")
}
}
}
如果想改变“取消”按钮的行为,就给 mButtonNegative 设置监听器。



