Android `` Невозможно добавить нулевой токен окна не для приложения ''

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

person michael    schedule 28.10.2011    source источник
comment
Как мы должны знать, не размещая код?   -  person Falmarri    schedule 28.10.2011
comment
Пожалуйста, обратитесь к этому ответу, главное, чтобы опубликовать ссылку на этот ответ, это хорошая беседа в комментариях к этому ответу, в которых описывается, почему возникает эта проблема и как лучше всего с ней справиться http://stackoverflow.com/a/7229248/501483   -  person dharam    schedule 08.07.2013
comment
Если вы используете Службу, прочтите заголовок stackoverflow.com/questions/23516689/.   -  person CoolMind    schedule 05.05.2016


Ответы (12)


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

new Dialog(getApplicationContext());

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

Вы должны попробовать что-то вроде:

new Dialog(YourActivity.this);
person Peter Knego    schedule 28.10.2011
comment
Спасибо. Но я не использовал новый диалог (getApplicationContext ()); Я использую только new AlertDialog.Builder (mContext); где mContext - это ссылка на действие. - person michael; 04.11.2011
comment
Тогда mContext должен быть MyActivity.this. - person Luis; 13.03.2012
comment
Документы для Android (developer.android.com/guide/topics/ui/ dialogs.html # CustomDialog) для создания настраиваемого диалогового окна имеют эту ошибку. Контекст mContext = getApplicationContext (); Диалог диалога = новый диалог (mContext); Ваше исправление приводит к диалогу Dialog dialog = new Dialog (this); Что работает! Спасибо - person bnieland; 21.09.2012
comment
developer.android.com/guide/topics/ui/dialogs.html исправлено (давно). Просто указываю на это для справки. Шаблон также был улучшен. :) - person Martin Marconcini; 03.05.2013
comment
Всегда создавать каждый диалог с передачей YourActivity.this - person Pratik Butani; 03.01.2014
comment
@ ツ FellinLovewithAndroid ツ что делать, если я хочу диалог поверх фрагмента - person Sagar Devanga; 23.12.2014
comment
Используйте getActivity() @SagarDevanga - person Pratik Butani; 23.12.2014
comment
Спасибо @ ツ FellinLovewithAndroid ツ, это сработало, но я не понял, почему мы передаем активность, когда она требует контекста. - person Sagar Devanga; 23.12.2014
comment
@SagarDevanga, потому что Activity также является контекстом. Это подкласс контекста. - person gbenroscience; 19.01.2018

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

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

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
person codezjx    schedule 25.12.2014
comment
Да, довольно просто. И не забудьте добавить разрешение, я редактировал только что. - person codezjx; 18.06.2015
comment
Невозможно использовать getActivity () в RecyclerAdapter - person Martin Erlic; 25.09.2016
comment
Это замечательно :) - person Syed Hamza Hassan; 24.04.2017
comment
Как добавить флаг? - person Conner Dassen; 15.03.2018

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

new Dialog(getApplicationContext());

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

new Dialog(this);

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

person postNuKe    schedule 07.04.2013
comment
Ваш ответ правильный, однако он будет работать только тогда, когда вы находитесь в области действия. Если вы находитесь во внутренней области видимости, вы должны использовать MyActivity.class вместо this, потому что this относится к другому объекту. - person Shahar; 15.09.2015
comment
Кроме того, this позаботится о том, чтобы ваш Dialog унаследовал вашу тему. - person TheRealChx101; 10.11.2015

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

person Priyank Joshi    schedule 01.02.2013
comment
Зачем использовать getParent ()? Что значит? - person José Castro; 27.02.2013
comment
Когда вы показываете какой-либо диалог в другом классе, который не расширяет класс Activity, вы не можете получить контекст этого класса, расширяющего Activity. Итак, чтобы получить контекст внутри вашего класса, в котором вы пытаетесь показать диалог, но не расширяете Activity, вы можете использовать getParent (), который возвращает вам контекст этого высшего действия. - person Priyank Joshi; 04.03.2013
comment
Спасибо @PriyankJoshi, вы спасли мне день, он также решает странное исключение Android. Невозможно добавить окно, недопустимо; ваша деятельность запущена ?. - person Eslam Yousef Mohammed; 24.12.2013
comment
Как я могу использовать getParent ()? - person vinidog; 10.07.2016
comment
Спасибо! В моем случае это сработало. Я звонил this.parent.getActivity().getApplicationContext(), но this.parent.getActivity() помогло. - person carlodonz; 16.02.2019

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

 getApplicationContext()
 mContext which is passed by activity.

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

Activity activity=YourActivity.this;

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

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

person Harshid    schedule 04.05.2013

Я пробовал это в поле контекста:

this.getActivity().getParent()

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

public class filtro extends Fragment{...
person Matias    schedule 04.05.2013

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

Вот трюк, который я использовал 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
person codingwithtashi    schedule 04.06.2019
comment
Спасибо ! за сэкономленное драгоценное время !! (^_^) - person Nice umang; 28.06.2019

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

person Anonymous-E    schedule 27.05.2018

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

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

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

Позже изменилось вот так,

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

Он отлично работает для меня.

person Soorya    schedule 17.08.2017

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

person Makvin    schedule 09.03.2018

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

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

Кроме того, диалоговое окно инициализации предупреждения с именем действия:

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

Для получения дополнительных сведений посетите ==> Как создать диалоговое окно предупреждений в Android

person Ganesh Garad    schedule 17.03.2019

На всякий случай, если вы пытаетесь добиться отображения диалога из фрагмента. Просто используйте метод getActivity ().

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
person Rajan    schedule 07.05.2021