Wyjątek „Nie można dodać okna - token zerowy nie jest dla aplikacji” w systemie Android

134

Gdy próbuję otworzyć okno dialogowe, pojawia się następujący wyjątek Androida. Czy ktoś może mi pomóc zrozumieć, co się dzieje i jak mogę rozwiązać ten problem?

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)
Michael
źródło
8
Skąd mamy wiedzieć bez wysyłania kodu?
Falmarri
1
Proszę odnieść się do tej odpowiedzi, najważniejszą rzeczą do opublikowania linku do tej odpowiedzi jest fajna rozmowa w komentarzach na temat tej odpowiedzi, które opisują, dlaczego pojawia się ten problem i jak najlepiej sobie z nim poradzić http://stackoverflow.com/a/ 7229248/501483
Dharam
Jeśli korzystasz z usługi, przeczytaj stackoverflow.com/questions/23516689/… .
CoolMind

Odpowiedzi:

421

Zgaduję - czy próbujesz stworzyć Dialog z kontekstem aplikacji? Coś takiego:

new Dialog(getApplicationContext());

To jest źle. Musisz użyć kontekstu działania.

Musisz spróbować:

new Dialog(YourActivity.this);
Peter Knego
źródło
1
Dzięki. Ale nie użyłem nowego okna dialogowego (getApplicationContext ()); Używam tylko „new AlertDialog.Builder (mContext);” gdzie mContext jest odniesieniem do działania.
michael
10
Wtedy mContext powinno być MyActivity.this.
Luis
10
Dokumentacja systemu Android ( developer.android.com/guide/topics/ui/dialogs.html#CustomDialog ) dotycząca tworzenia niestandardowego okna dialogowego zawiera ten błąd. Context mContext = getApplicationContext (); Okno dialogowe = nowe okno dialogowe (mContext); Twoja poprawka prowadzi do Dialog dialog = new Dialog (this); Co działa! Dzięki
bnieland
1
developer.android.com/guide/topics/ui/dialogs.html został naprawiony (od jakiegoś czasu). Po prostu wskazuję to w celach informacyjnych. Wzór również został poprawiony. :)
Martin Marconcini
2
Użyj getActivity()@SagarDevanga
Pratik Butani
34

Możesz nadal używać getApplicationContext(), ale przed użyciem powinieneś dodać tę flagę:, dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)a błąd się nie pojawi.

I nie zapomnij dodać uprawnień:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
codezjx
źródło
Tak, to całkiem proste. I nie zapomnij dodać uprawnień, edytowałem przed chwilą.
codezjx
3
Nie można użyć getActivity () w RecyclerAdapter
Martin Erlic
To jest niesamowite :)
Syed Hamza Hassan
Jak dodać flagę?
Conner Dassen
13

W moim przypadku próbowałem stworzyć moje okno dialogowe w następujący sposób:

new Dialog(getApplicationContext());

Więc musiałem się zmienić na:

new Dialog(this);

I u mnie działa dobrze;)

postNuKe
źródło
1
Twoja odpowiedź jest prawidłowa, jednak zadziała tylko wtedy, gdy jesteś w zakresie działalności. Jeśli jesteś w zakresie wewnętrznym, musisz użyć MyActivity.classargumentu, thisponieważ thisodnosi się do innego obiektu.
Shahar
1
Ponadto thisupewni się, że DialogTwój motyw odziedziczy.
TheRealChx101
12

Spróbuj getParent()w miejscu kłótni, contexttakim jak new AlertDialog.Builder(getParent());Mam nadzieję, że zadziała, zadziałało dla mnie.

Priyank Joshi
źródło
Po co używać getParent ()?, Co to znaczy?
José Castro
2
Kiedy pokazujesz jakiekolwiek okno dialogowe w innej klasie, które nie rozszerza klasy Activity, możesz nie uzyskać kontekstu tej klasy, która rozszerza Activity. Aby więc uzyskać kontekst wewnątrz swojej klasy, w której próbujesz wyświetlić okno dialogowe, ale nie rozszerzając działania, możesz użyć metody getParent (), która zwraca kontekst tego nadrzędnego działania.
Priyank Joshi
1
Dzięki @PriyankJoshi, uratowałeś mi dzień, rozwiązuje to również dziwny wyjątek „Nie można dodać okna w Androidzie, czy Twoja aktywność jest uruchomiona?”.
Eslam Yousef Mohammed
Jak mogę używać metody getParent ()?
vinidog,
Dziękuję Ci! W moim przypadku zadziałało. Dzwoniłem, this.parent.getActivity().getApplicationContext()ale this.parent.getActivity()załatwiłem sprawę.
carlodonz
3

Zgaduję - czy próbujesz stworzyć Dialog za pomocą.

 getApplicationContext()
 mContext which is passed by activity.

jeśli wyświetlasz klasę braku aktywności okna dialogowego, musisz przekazać aktywność jako parametr.

Activity activity=YourActivity.this;

Teraz będzie działać świetnie.

Jeśli znajdziesz jakieś kłopoty, daj mi znać.

Ostry
źródło
2

Próbowałem z tym w polu kontekstowym:

this.getActivity().getParent()

i dla mnie działa dobrze. To pochodzi z klasy, która wykracza poza „Fragment”:

public class filtro extends Fragment{...
Matias
źródło
2

Witam, jeśli używasz adaptera, może być szansa.
Wszystko, co musisz wiedzieć, kiedy używałeś dowolnego okna dialogowego w adapterze, getContext (), kontekstu lub aktywności czasami nie zadziała.

Oto sztuczka, v.getRootView().getContext() której użyłem, gdzie v jest obiektem widoku, do którego się odnosisz.
Na przykład.


            @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
kontashi35
źródło
Dziękuję Ci ! za zaoszczędzenie mojego cennego czasu !! (^_^)
Nice umang
1

Mam ten sam wyjątek. co robię, aby to naprawić, to przekazanie wystąpienia okna dialogowego jako parametru do funkcji i użycie go zamiast przekazywania tylko kontekstu, a następnie użycie metody getContext (). To rozwiązanie rozwiązuje mój problem, mam nadzieję, że może pomóc

Anonimowy-E.
źródło
0

Mam ten wyjątek, kiedy próbowałem otworzyć okno postępu w ramach wtyczki Cordova, używając poniższych dwóch przypadków,

  1. new ProgressDialog (this.cordova.getActivity (). getParent ());

  2. new ProgressDialog (this.cordova.getActivity (). getApplicationContext ());

Później tak się zmieniło,

new ProgressDialog (this.cordova.getActivity ());

Dla mnie działa dobrze.

soorya
źródło
0

Użyj tego i kontekst nie zadziałał dla mnie, ale MyActivityName. To zadziałało. Mam nadzieję, że to pomoże każdemu, kto tego potrzebuje.

Makvin
źródło
0

Rozwiązałem ten błąd, dodając poniżej uprawnienia użytkownika w AndroidManifest.xml

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

Ponadto okno dialogowe Zainicjuj alert z nazwą działania:

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

Aby uzyskać więcej informacji, odwiedź ==> Jak utworzyć okno dialogowe alertów w systemie Android

Ganesh Garad
źródło