Android 'Невозможно добавить окно - токен null не для приложения' исключение - PullRequest
134 голосов
/ 28 октября 2011

При попытке открыть диалоговое окно я получаю следующее исключение для 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)

Ответы [ 11 ]

419 голосов
/ 28 октября 2011

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

new Dialog(getApplicationContext());

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

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

new Dialog(YourActivity.this);
34 голосов
/ 25 декабря 2014

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

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

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
12 голосов
/ 01 февраля 2013

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

11 голосов
/ 07 апреля 2013

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

new Dialog(getApplicationContext());

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

new Dialog(this);

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

3 голосов
/ 04 мая 2013

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

 getApplicationContext()
 mContext which is passed by activity.

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

Activity activity=YourActivity.this;

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

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

2 голосов
/ 04 мая 2013

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

this.getActivity().getParent()

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

public class filtro extends Fragment{...
1 голос
/ 04 июня 2019

Здравствуйте, если вы используете адаптер, может быть шанс.
Все, что вам нужно знать, когда вы используете какой-либо диалог в адаптере, 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 голос
/ 27 мая 2018

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

0 голосов
/ 17 марта 2019

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

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

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

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

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

0 голосов
/ 09 марта 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...