我在AlertDialog中遇到了问题:如果我想在打开一个新Activity后完成当前Activity,我会崩溃并出现以下错误:E/WindowManager: android.view.WindowLeaked: Activity com.myapp.ShowsActivity has leaked window DecorView@2435213[ShowsActivity] that was originally added here
当我想注销一个用户时,就会发生这种情况。AuthLogic.logout()方法被调用(我将其导出到一个独立的类中,以获得更可读的代码),这会触发一个“你确定吗?”警报对话框,然后重定向到登录活动。注销按钮逻辑:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_shows)
// some code . . .
btnLogout.setOnClickListener {
AuthLogic.logout(this)
finish() // *1
}
}
AuthLogic.logout():
fun logout(context: Context) {
val builder = AlertDialog.Builder(context)
builder.setTitle(R.string.are_you_sure)
builder.setMessage(R.string.confirm_msg_logout)
builder.setPositiveButton(R.string.confirm) { dialogInterface: DialogInterface, i: Int ->
// aditional logout logic
context.startActivity(AuthActivity.newStartIntent(context))
}
builder.setNegativeButton(R.string.cancel) { di: DialogInterface, _: Int -> }
builder.show()
}
我注意到,如果我在 *1注解上完成活动,会弹出错误。如果我删除该行,不会显示错误,但这会导致一个问题,因为我可以返回到上一个活动,而我不希望这样。我已经尝试在setPositiveButton
lambda方法上使用dialogInterface.dismiss()
,但没有成功。有什么想法吗?
编辑!已解决!:)
我重写了AuthLogic.logout():
fun logout(context: Context) {
val builder = AlertDialog.Builder(context)
builder.setTitle(R.string.are_you_sure)
builder.setMessage(R.string.confirm_msg_logout)
builder.setPositiveButton(R.string.confirm) { dialogInterface: DialogInterface, i: Int ->
// logout logic ...
dialogInterface.dismiss()
context.startActivity(AuthActivity.newStartIntent(context))
(context as Activity).finish()
}
builder.setNegativeButton(R.string.cancel) { di: DialogInterface, _: Int -> }
builder.show()
}
并删除了 *1上的finish()线。感谢@Johan Kovalski的提示。
3条答案
按热度按时间whlutmcx1#
尝试在完成练习之前关闭提醒对话框。
. println();
im9ewurl2#
对话框
Window
是用活动Context
创建的。Activity
必须清理它拥有的窗口。你应该先销毁对话框,然后销毁活动。或者使用DialogFragment
。你在问题中提到的日志告诉你Activity不能被正确地销毁(正如你用
finish()
请求的那样),因为对话框仍然保存着对它的引用。n1bvdmb63#
这样也能解决问题