Android "Неможливо додати вікно - маркер null не є додатком"


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
Як нам це знати, не розміщуючи код?
Falmarri


1
Будь ласка, зверніться до цієї відповіді. Головне, щоб розмістити посилання на цю відповідь - це приємна розмова в коментарях над цією відповіддю, яка описує, чому ця проблема виникає і який найкращий спосіб вирішити її http://stackoverflow.com/a/ 7229248/501483
дхарам

Якщо ви користуєтесь Сервісом, прочитайте stackoverflow.com/questions/23516689/… .
CoolMind

Відповіді:


421

Я здогадуюсь - чи намагаєтесь ви створити діалог із контекстом програми? Щось на зразок цього:

new Dialog(getApplicationContext());

Це неправильно. Потрібно використовувати контекст діяльності.

Ви повинні спробувати так:

new Dialog(YourActivity.this);

1
Дякую. Але я не використовував новий Dialog (getApplicationContext ()); Я використовую лише "новий AlertDialog.Builder (mContext);" де mContext є референтом до діяльності.
michael

10
Тоді mContext має бути MyActivity.this.
Луїс

10
Документи андроїда ( developer.android.com/guide/topics/ui/dialogs.html#CustomDialog ) для створення користувальницького діалогового вікна мають цю помилку. Контекст mContext = getApplicationContext (); Діалогове вікно діалогу = новий діалог (mContext); Виправлення призводить до діалогового вікна діалогу = новий діалог (це); Який працює! Дякую
bnieland

1
developer.android.com/guide/topics/ui/dialogs.html виправлено (з деякого часу). Просто вказавши на це для довідки. Вдосконалено і модель. :)
Мартін Маркончіні

2
Використовуйте getActivity()@SagarDevanga
Pratik Butani

34

Ви можете продовжувати використовувати getApplicationContext(), але перед використанням слід додати цей прапор:, dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)і помилка не з’явиться.

І не забудьте додати дозвіл:

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

Так, це досить просто. І не забудьте додати дозвіл, я редагував саме зараз.
codezjx

3
Неможливо використовувати getActivity () в RecyclerAdapter
Мартін Ерлік,

Це приголомшливо :)
Syed Hamza Hassan

Як ви додаєте прапор?
Коннер Дассен

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
Коли ви показуєте будь-яке діалогове вікно іншого класу, яке не розширює клас активності, тому ви не можете отримати контекст цього класу, який розширює активність. Таким чином, щоб отримати контекст всередині вашого класу, де ви намагаєтесь показати діалогове вікно, але не розширюючи Діяльність, ви можете використовувати getParent (), який повертає вам контекст цієї вищої діяльності.
Priyank Joshi

1
Дякую @PriyankJoshi, ти врятував мій день, він також вирішує дивний виняток "Android Неможливо додати вікно, недійсне; чи працює ваша діяльність?".
Еслам Юсеф Мухаммед

Як я можу використовувати getParent ()?
вінідог

Дякую! Це спрацювало в моєму випадку. Я дзвонив, this.parent.getActivity().getApplicationContext()але this.parent.getActivity()робив трюк.
carlodonz

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

Я отримав це виняток, коли спробував відкрити діалог прогресу під плагіном Кордова, використовуючи нижче два випадки,

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

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

Пізніше змінилося так,

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

Це працює добре для мене.


0

Використовуйте це і контекст для мене не працював ... але MyActivityName.це працювало. Сподіваюся, це допоможе кожному, хто цього потребує.


0

Я вирішив цю помилку, додавши нижче дозвіл користувача в AndroidManifest.xml

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

Також ініціалізуйте діалогове вікно сповіщення із назвою діяльності:

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

Детальніше див. У розділі ==> Як створити діалог сповіщень в Android

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.