Android "Невозможно добавить оконный токен null не для исключения приложения"

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

Ответ 1

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

new Dialog(getApplicationContext());

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

Вам нужно попробовать:

new Dialog(YourActivity.this);

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

new Dialog(getApplicationContext());

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

new Dialog(this);

И это отлично работает для меня;)

Ответ 5

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

 getApplicationContext()
 mContext which is passed by activity.

Если вы выведете диалоговый класс non activity, тогда вам необходимо передать активность в качестве параметра.

Activity activity=YourActivity.this;

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

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

Ответ 6

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

this.getActivity().getParent()

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

public class filtro extends Fragment{...

Ответ 7

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

Ответ 8

У меня есть это исключение, когда я попытался открыть Progress Dialog под Кордовым плагином, используя ниже двух случаев,

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

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

Позже это изменилось,

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

Его работа прекрасна для меня.

Ответ 9

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

Ответ 10

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

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

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

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

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

Ответ 11

Здравствуйте, если вы используете адаптер, может быть шанс.
Все, что вам нужно знать, когда вы используете какой-либо диалог в адаптере, 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/info/6367771/displaying-alertdialog-inside-a-custom-listadapter-class