Android: «Невозможно добавить окно - исключение токена не для приложения»


134

При попытке открыть диалоговое окно я получаю следующее исключение для Android. Может кто-нибудь, пожалуйста, помогите мне понять, что происходит и как я могу решить эту проблему?

android.view.WindowManager$BadTokenException: 
  Unable to add window -- token null is not for an application
    at android.view.ViewRoot.setView(ViewRoot.java:509)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
    at android.app.Dialog.show(Dialog.java:241)

8
Как мы должны знать, не публикуя код?
Фалмарри,


1
Пожалуйста, обратитесь к этому ответу, главное чтобы опубликовать ссылку на этот ответ, есть хороший разговор в комментариях по поводу этого ответа, которые описывают, почему эта проблема возникает и как лучше всего с ней бороться http://stackoverflow.com/a/ 7229248/501483
дхарам

Если вы используете Сервис, прочитайте stackoverflow.com/questions/23516689/… .
CoolMind

Ответы:


421

Я догадываюсь - вы пытаетесь создать диалог с контекстом приложения? Что-то вроде этого:

new Dialog(getApplicationContext());

Это не верно. Вам нужно использовать контекст деятельности.

Вы должны попробовать, как:

new Dialog(YourActivity.this);

1
Спасибо. Но я не использовал новый диалог (getApplicationContext ()); Я использую только 'new AlertDialog.Builder (mContext);' где mContext является ссылкой на деятельность.
Майкл

10
Тогда mContext должен быть MyActivity.this.
Луис

10
Документы Android ( developer.android.com/guide/topics/ui/dialogs.html#CustomDialog ) для создания настраиваемых диалоговых окон содержат эту ошибку. Context mContext = getApplicationContext (); Диалог диалога = новый диалог (mContext); Ваше исправление приводит к диалогу Dialog = новый диалог (это); Который работает! Спасибо
bnieland

1
developer.android.com/guide/topics/ui/dialogs.html была исправлена ​​(некоторое время назад). Просто указываю на это для справки. Шаблон был также улучшен. :)
Мартин Маркончини

2
Используйте getActivity()@SagarDevanga
Пратик Бутани

34

Вы можете продолжать использовать getApplicationContext(), но перед использованием вы должны добавить этот флаг:, dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)и ошибка не будет отображаться.

И не забудьте добавить разрешение:

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

Да, это довольно просто. И не забудьте добавить разрешение, я только что отредактировал.
codezjx

3
Невозможно использовать getActivity () в RecyclerAdapter
Мартин Эрлик

Это потрясающе :)
Сайед Хамза Хасан

Как вы добавляете флаг?
Коннер Дассен

13

В моем случае я пытался создать свой диалог следующим образом:

new Dialog(getApplicationContext());

Поэтому мне пришлось поменять на:

new Dialog(this);

И это прекрасно работает для меня;)


1
Ваш ответ правильный, но он будет работать только тогда, когда вы находитесь в области действия. Если вы находитесь во внутренней области видимости, вы должны использовать MyActivity.classвместо thisпотому, что thisотносится к другому объекту.
Шахар

1
Кроме того, thisубедитесь, что ваша Dialogнаследует вашу тему.
TheRealChx101

12

Попробуйте getParent()в месте ссоры contextтипа new AlertDialog.Builder(getParent());Надеюсь, что это сработает, у меня сработало.


Зачем использовать getParent ()? Что это значит?
Хосе Кастро

2
Когда вы показываете какой-либо диалог в другом классе, который не расширяет класс Activity, вы можете не получить контекст этого класса, который расширяет Activity. Таким образом, чтобы получить контекст внутри вашего класса, где вы пытаетесь показать диалог, но не расширяете Activity, вы можете использовать getParent (), который возвращает вам контекст этой превосходящей активности.
Приянк Джоши

1
Спасибо @PriyankJoshi, вы спасли мой день, он также решает странное исключение «Android не может добавить окно, недопустимо; ваша деятельность запущена?».
Ислам Юсеф Мухаммед

Как я могу использовать getParent ()?
Vinidog

Спасибо! Это сработало в моем случае. Я звонил, this.parent.getActivity().getApplicationContext()но this.parent.getActivity()сделал свое дело.
Карлодонз

3

Я догадываюсь - вы пытаетесь создать диалог с помощью.

 getApplicationContext()
 mContext which is passed by activity.

если вы выводите диалоговое окно, не относящееся к классу активности, то вы должны передать активность в качестве параметра.

Activity activity=YourActivity.this;

Теперь это будет отлично работать.

Если вы обнаружите какие-либо проблемы, дайте мне знать.


2

Я попытался с этим в поле контекста:

this.getActivity().getParent()

и это прекрасно работает для меня. Это было из класса, который происходит от "Фрагмент":

public class filtro extends Fragment{...

2

Здравствуйте, если вы используете адаптер, может быть шанс.
Все, что вам нужно знать, когда вы используете какой-либо диалог в адаптере, getContext (), контекст или действие, не будет работать когда-нибудь.

Вот трюк, который я использовал, v.getRootView().getContext() где v - это объект представления, на который вы ссылаетесь.
Например.


            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                new DatePickerDialog(v.getRootView().getContext(), date, myCalendar
                        .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                        myCalendar.get(Calendar.DAY_OF_MONTH)).show();
            }
        });  
If you are getting this problem because of alert dialog.
Refer [here][1] But it is same concept.


  [1]: https://stackoverflow.com/questions/6367771/displaying-alertdialog-inside-a-custom-listadapter-class

Спасибо ! за сэкономленное мое драгоценное время !! (^_^)
Хороший уманг

1

Я получил то же исключение. Чтобы исправить это, я должен передать экземпляр диалога в качестве параметра в функцию и использовать его вместо передачи только контекста, а затем с помощью getContext (). это решение решит мою проблему, надеюсь, оно поможет


0

Я получил это исключение, когда попытался открыть диалог прогресса в плагине Cordova, используя следующие два случая:

  1. новый ProgressDialog (this.cordova.getActivity (). getParent ());

  2. новый ProgressDialog (this.cordova.getActivity (). getApplicationContext ());

Позже изменился, как это,

новый ProgressDialog (this.cordova.getActivity ());

Это работает нормально для меня.


0

Используйте это, и контекст не работал для меня .. но MyActivityName.this работал. Надеюсь, это поможет всем, кто в этом нуждается.


0

Я решил эту ошибку, добавив ниже разрешение пользователя в AndroidManifest.xml

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

Кроме того, диалоговое окно «Инициализация оповещения» с именем действия:

AlertDialog.Builder builder = new AlertDialog.Builder(YourActivity.this);

Для получения более подробной информации, посетите ==> Как создать Alert Dialog в Android

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.