单击刷新列表时 Kotlin 应用程序崩溃

发布于 2025-01-15 23:52:57 字数 1495 浏览 1 评论 0原文

我制作了一个 Android 应用程序,它使用带有适配器的自定义列表视图、刷新按钮和每行的 onlick 事件。 我的问题是,第一次列表加载一切正常,但是当我点击刷新然后单击随机行时,应用程序崩溃并出现以下错误:

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?

在 onlick 事件中,我有一个带有 4 个按钮的自定义对话框,错误位于最后一行(builder.create().show())。

rowView.setOnClickListener {
    val builder = AlertDialog.Builder(context)
    builder.setTitle(context.getString(R.string.alert_commands_desc) + " " + recipe.valve)
    builder.setItems(
        arrayOf<CharSequence>(context.getString(R.string.open_valve_button),
            context.getString(R.string.close_valve_button),
            context.getString(R.string.deny_command_button),
            context.getString(R.string.close))
    ) { dialog, which ->
        when (which) {
            0 -> sendValveCommand("AV", recipe.id, context)
            1 -> sendValveCommand("CV", recipe.id, context)
            2 -> sendValveCommand("AC", recipe.id, context)
            3 -> dialog.dismiss()
        }
    }
    builder.create().show()
}

这是适配器部分:

if (json.has("Apparati_Controllo")) {
    val controlElementList = json.getJSONArray("Apparati_Controllo")
    val recipeList = ControlElement.populateRecipe(controlElementList)
    val adapter = ControlElementAdapter(thisContext, recipeList)
    listView.adapter = adapter
}

我尝试清除适配器、列表、更改上下文,但没有任何效果... 非常感谢,请告诉我您是否需要更多代码。

I've made an Android app that use a custom listview with an adapter, a refresh button and an onlick event for each row.
My problem is that the first time that the list load all works well, but when i hit refresh then i click on a random row the app crashes with the following error:

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?

In the onlick event i have a custom dialog with 4 buttons, the error is in the last row (builder.create().show()).

rowView.setOnClickListener {
    val builder = AlertDialog.Builder(context)
    builder.setTitle(context.getString(R.string.alert_commands_desc) + " " + recipe.valve)
    builder.setItems(
        arrayOf<CharSequence>(context.getString(R.string.open_valve_button),
            context.getString(R.string.close_valve_button),
            context.getString(R.string.deny_command_button),
            context.getString(R.string.close))
    ) { dialog, which ->
        when (which) {
            0 -> sendValveCommand("AV", recipe.id, context)
            1 -> sendValveCommand("CV", recipe.id, context)
            2 -> sendValveCommand("AC", recipe.id, context)
            3 -> dialog.dismiss()
        }
    }
    builder.create().show()
}

This is the adapter part:

if (json.has("Apparati_Controllo")) {
    val controlElementList = json.getJSONArray("Apparati_Controllo")
    val recipeList = ControlElement.populateRecipe(controlElementList)
    val adapter = ControlElementAdapter(thisContext, recipeList)
    listView.adapter = adapter
}

I tried by clearing adapter, list, change context, nothing works...
Thanks a lot, tell me if you need more code.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

为人所爱 2025-01-22 23:52:57

我从来不喜欢对任何需要显示的视图使用 thisgetApllicationContext() 。而是使用这个:

this@MyActivityName //in kotlin
MyActivityName.this //in java

同时将其添加到您的 AndroidManifest.xml

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

I never prefer using this or getApllicationContext() for any view that needs to be shown. Instead use this:

this@MyActivityName //in kotlin
MyActivityName.this //in java

Also add this in your AndroidManifest.xml

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文