Android 在AlertDialog操作引发错误后完成当前活动
AlertDialog有问题:如果我想在打开新活动后完成当前活动,我会因以下错误崩溃:Android 在AlertDialog操作引发错误后完成当前活动,android,android-studio,kotlin,android-alertdialog,Android,Android Studio,Kotlin,Android Alertdialog,AlertDialog有问题:如果我想在打开新活动后完成当前活动,我会因以下错误崩溃: E/WindowManager:android.view.WindowLeaked:Activity com.myapp.ShowsActivity已泄漏窗口DecorView@2435213最初添加到此处的[ShowsActivity] 当我想注销用户时会发生这种情况。调用AuthLogic.logout()方法(我将其导出到一个独立类以获得更可读的代码),这会触发一个“确定吗?”警报对话框,然后重定向到登
E/WindowManager:android.view.WindowLeaked:Activity com.myapp.ShowsActivity已泄漏窗口DecorView@2435213最初添加到此处的[ShowsActivity]
当我想注销用户时会发生这种情况。调用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():
我注意到,如果我在*1评论上完成活动,就会弹出错误。如果我删除该行,则不会显示错误,但这会导致问题,因为我可以返回到上一个活动,我不希望这样。我已经尝试在setPositiveButton
lambda方法上使用dialogInterface.dismise()
,但没有成功。有什么想法吗
编辑!已解决!:)强>
我重写了AuthLogic.logout():
并删除了*1上的finish()线。
感谢@Johan Kovalski提供的提示。在完成活动之前,尝试关闭警报对话框
yourAlertDialog.dimis() 对话框
窗口
是通过活动上下文
创建的<代码>活动必须清理其拥有的窗口。您应该先销毁对话框,然后销毁活动。或者使用对话框片段
您在问题中提到的日志告诉您,无法正确销毁活动(正如您使用
finish()
)请求的那样),因为对话框仍保留对它的引用。单击警报对话框的确认按钮后,完成活动,不只是显示对话框。这个错误基本上是告诉您在完成活动之前关闭警报对话框
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()
}
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()
}