Я сделал приложение для 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
}
Я пытался очистить адаптер, список, изменить контекст, ничего не работает... Большое спасибо, скажите мне, если вам нужно больше кода.
Я никогда не предпочитаю использовать this или getApllicationContext() для любого представления, которое нужно показать. Вместо этого используйте это:
this@MyActivityName //in kotlin
MyActivityName.this //in java
Также добавьте это в свой AndroidManifest.xml
<uses-permission android:name = "android.permission.SYSTEM_ALERT_WINDOW"/>