我正在用 Kotlin 开发一个 Android 应用。在 Utils 类中我有这个方法:
fun showAutoHideMessage(context: Context, title: String, message: String, positiveButtonTitle: String?, negativeButtonTitle: String?, neutralButtonTitle: String?, delay: Long, okListener: DialogInterface.OnClickListener){
val builder = AlertDialog.Builder(context)
with(builder)
{
setTitle(title)
setMessage(message)
positiveButtonTitle?.let {
setPositiveButton(positiveButtonTitle, okListener)
}
negativeButtonTitle?.let {
setNegativeButton(negativeButtonTitle, okListener)
}
neutralButtonTitle?.let {
setNeutralButton(neutralButtonTitle, okListener)
}
val alert = create()
alert.show()
val handler = Handler()
val runnable = Runnable {
if (alert.isShowing()) {
alert.dismiss()
}
}
alert.setOnDismissListener(DialogInterface.OnDismissListener { handler.removeCallbacks(runnable) })
handler.postDelayed(runnable, delay)
}
}
这个想法是显示一个警报对话框并在一段时间后关闭它,直到今天我都想在关闭时间后做一些事情。所以我让用户触摸肯定的按钮并且 onClickListener 被很好地触发(稍后我调用远程网络服务)。用户可以取消,所以 onClickListener 被触发,我什么都不做。但延迟后,AlertDialog 被解除,我也想调用远程网络服务。
我做了第一种方法,将 DialogInterface.OnDismissListener 传递给这个函数,似乎可行,但我无法执行 handler.removeCallbacks(runnable),我不确定是否有更好的方法。
这就是我现在调用函数的方式:
showAutoHideMessage(this, "Title", "Message", "Confirm", "Cancel", null, 5000,
DialogInterface.OnClickListener { dialog, which ->
when (which) {
DialogInterface.BUTTON_POSITIVE -> {
doSomething()
}
DialogInterface.BUTTON_NEGATIVE -> {
}
DialogInterface.BUTTON_NEUTRAL ->{
}
}
}/*,
DialogInterface.OnDismissListener {
doSomething()
}*/
)