AlertDialog 操作抛出错误后完成当前活动

问题描述 投票:0回答:3

我在使用 AlertDialog 时遇到问题:如果我想在打开一个新活动后完成当前活动,我会因以下错误而崩溃:

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 评论上完成我的活动,就会弹出错误。如果我删除该行,则不会显示任何错误,但这会导致问题,因为我可以返回到之前的活动,但我不希望那样。我已经尝试在

dialogInterface.dismiss()
lambda 方法上使用
setPositiveButton
,但没有成功。有什么想法吗?

编辑!解决了!:)

我重写了 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 的提示。

android android-studio kotlin android-alertdialog
3个回答
1
投票

在完成活动之前尝试关闭您的警报对话框。

你的AlertDialog.dimiss();


0
投票

Dialog

Window
是使用活动
Context
创建的。
Activity
必须清理它拥有的窗口。您应该先销毁对话,然后再销毁活动。或者使用
DialogFragment
.

您提到的日志告诉您无法正确销毁活动(正如您使用

finish()
所要求的那样),因为对话仍然引用它。


0
投票

这样也能解决问题

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
© www.soinside.com 2019 - 2024. All rights reserved.