Я пытаюсь открыть диалоговое окно, но каждый раз, когда я пытаюсь открыть его, оно выдает следующее исключение:
Uncaught handler: thread main exiting due to uncaught exception
android.view.WindowManager$BadTokenException:
Unable to add window -- token null is not for an application
at android.view.ViewRoot.setView(ViewRoot.java:460)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
at android.app.Dialog.show(Dialog.java:238)
at android.app.Activity.showDialog(Activity.java:2413)
Я создаю это, звоня showDialog
с идентификатором дисплея. onCreateDialog
Обработчик регистрирует штраф , и я могу пройти через него без проблем, но я прикрепил его , так как это кажется , что я что - то не хватает:
@Override
public Dialog onCreateDialog(int id)
{
Dialog dialog;
Context appContext = this.getApplicationContext();
switch(id)
{
case RENAME_DIALOG_ID:
Log.i("Edit", "Creating rename dialog...");
dialog = new Dialog(appContext);
dialog.setContentView(R.layout.rename);
dialog.setTitle("Rename " + noteName);
break;
default:
dialog = null;
break;
}
return dialog;
}
Чего-то не хватает в этом? В некоторых вопросах говорилось о наличии этой проблемы при создании диалогового окна onCreate
, что происходит потому, что действие еще не создано, но это происходит из-за вызова из объекта меню, и appContext
переменная выглядит так, как будто она правильно заполнена в отладчике.
Вы не можете отобразить окно / диалог приложения через Контекст, который не является Деятельностью. Попробуйте передать действительную ссылку на активность
источник
activity.this
и ,activity.getBaseContext()
но безрезультатно. Любая помощь?.this
.То же самое с вещью getApplicationContext.
Документы на сайте Android говорят, что использовать его, но он не работает ... grrrrr :-P
Просто сделать:
«this» - это обычно ваша активность, с которой вы начинаете диалог.
источник
Документы Android предлагают использовать getApplicationContext ();
но он не будет работать вместо того, чтобы использовать текущую активность при создании экземпляра AlertDialog.Builder или AlertDialog или Dialog ...
Пример:
или
источник
Вместо того
getApplicationContext()
, чтобы просто использоватьActivityName.this
источник
У меня была похожая проблема, где у меня был другой класс, примерно такой:
Большую часть времени работал нормально, но иногда он вылетал с той же ошибкой. Тогда я понимаю, что у
MyActivity
меня было ...Поскольку я держал объект как
static
, второй прогон кода все еще содержал исходную версию объекта и, таким образом, все еще ссылался на оригиналActivity
, которого больше не существовало.Глупая глупая ошибка, тем более, что мне действительно не нужно было держать объект, как
static
прежде всего ...источник
Просто измените это на
Вместо того
источник
Другое решение состоит в том, чтобы установить тип окна для системного диалога:
Это требует
SYSTEM_ALERT_WINDOW
разрешения:Как говорят в документах:
Это решение, которое вы должны использовать, только если вам требуется диалоговое окно, которое не привязано к действию.
источник
Не используйте
getApplicationContext()
при объявлении DialougeВсегда используйте
this
или вашactivity.this
источник
Для вложенных диалогов эта проблема очень распространена, она работает, когда
используется вместо
эта альтернатива.
источник
Это сработало для меня
использование
источник
Вы также можете сделать это
Это сработало для меня!
источник
Как уже говорилось, вам нужен Activity в качестве контекста для диалога, используйте «YourActivity.this» для статического контекста или проверьте здесь, как использовать динамический контекст в безопасном режиме.
источник
Попробуйте сбросить
dialog
тип окна наНе забудьте использовать разрешение
android.permission.SYSTEM_ALERT_WINDOW
источник
Текст здесь: -
используйте это для получения
activity
контекста дляprogressdialog
или
progressdialog = new ProgressDialog(this);
используйте это для получения контекста приложения для
BroadcastListener
не дляprogressdialog
.источник
Лучший и самый безопасный способ показать «ProgressDialog» в AsyncTask, избегая проблемы утечки памяти, - это использовать «Обработчик» с Looper.main ().
тогда в 'onCreate'
Теперь вы закончили с установочной частью. Теперь вызовите showProgress () и hideProgress () в AsyncTask.
источник