Nie rozumiem, dlaczego tak się dzieje. Ten kod:
mProgressDialog = ProgressDialog.show(this, "", getString(R.string.loading), true);
działa dobrze. Jednak ten kod:
mProgressDialog = ProgressDialog.show(getApplicationContext(), "", getString(R.string.loading), true);
zgłasza następujący wyjątek:
W/WindowManager( 569): Attempted to add window with non-application token WindowToken{438bee58 token=null}. Aborting.
D/AndroidRuntime( 2049): Shutting down VM
W/dalvikvm( 2049): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
E/AndroidRuntime( 2049): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 2049): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tastekid.TasteKid/com.tastekid.TasteKid.YouTube}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
E/AndroidRuntime( 2049): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
E/AndroidRuntime( 2049): at android.app.ActivityThread.access$2100(ActivityThread.java:116)
E/AndroidRuntime( 2049): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
E/AndroidRuntime( 2049): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 2049): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 2049): at android.app.ActivityThread.main(ActivityThread.java:4203)
E/AndroidRuntime( 2049): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 2049): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 2049): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime( 2049): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
E/AndroidRuntime( 2049): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 2049): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049): at android.view.ViewRoot.setView(ViewRoot.java:460)
E/AndroidRuntime( 2049): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
E/AndroidRuntime( 2049): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/AndroidRuntime( 2049): at android.app.Dialog.show(Dialog.java:238)
E/AndroidRuntime( 2049): at android.app.ProgressDialog.show(ProgressDialog.java:107)
E/AndroidRuntime( 2049): at android.app.ProgressDialog.show(ProgressDialog.java:90)
E/AndroidRuntime( 2049): at com.tastekid.TasteKid.YouTube.onCreate(YouTube.java:45)
E/AndroidRuntime( 2049): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
E/AndroidRuntime( 2049): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
E/AndroidRuntime( 2049): ... 11 more
Jakieś pomysły, dlaczego tak się dzieje? Wołam to z onCreate
metody.
android
progressdialog
Felix
źródło
źródło
Fragment
, stackoverflow.com/questions/24825114/…Odpowiedzi:
Której wersji interfejsu API używasz? Jeśli mam rację co do tego, na czym polega problem, to został on naprawiony w systemie Android 1.6 (wersja API 4).
Wygląda na
getApplicationContext()
to, że odwołanie do obiektu, które zwraca, wskazuje tylko wartość null. Myślę, że masz problem podobny do tego, który miałem, polegający na tym, że część kodu w programieonCreate()
jest uruchamiana przed ukończeniem budowy okna. To będzie hack, ale spróbuj uruchomić nowy wątek za kilkaset milisekund (IIRC: 300-400 wydawało się działać dla mnie, ale będziesz musiał majstrować), który otwiera twój ProgressDialog i uruchamia wszystko, czego potrzebujesz ( np. sieciowe IO). Coś takiego:źródło
Używam systemu Android w wersji 2.1 z interfejsem API na poziomie 7. Napotkałem ten (lub podobny) problem i rozwiązałem go za pomocą tego:
zamiast tego:
Mam nadzieję że to pomoże :)
źródło
U mnie pracował na zmianę
do
Dziwne jest to, że pierwszy z nich można znaleźć w samouczku Google i ludzie dostają w tym błąd.
źródło
this
sam w sobie nie zadziała, jeśli robisz to na przykład w odbiorniku kliknięć.Nie sądzę, że jest to problem czasowy wokół zerowego kontekstu aplikacji
Spróbuj rozszerzyć aplikację w swojej aplikacji (lub po prostu użyj jej, jeśli już masz)
Udostępnij instancję jako prywatny singleton. To nigdy nie jest nieważne
Stwórz statycznego pomocnika w MyApp (który będzie używał singletona)
BUM!!
Sprawdź również odpowiedź inżyniera Androida tutaj: WindowManager $ BadTokenException
Zgadzam się, nie ma sensu, aby metoda przyjmowała parametr Context zamiast Activity.
źródło
Po przeczytaniu powyższych odpowiedzi stwierdziłem, że w mojej sytuacji następujące rozwiązania rozwiązały problem.
To spowodowało błąd
Opierając się na poprzednich odpowiedziach, które sugerowały, że kontekst jest zły, zmieniłem metodę getApplicationContext (), aby pobrać kontekst z widoku przekazanego do metody onClick przycisków.
Nie do końca rozumiem działanie Javy, więc mogę się mylić, ale domyślam się, że w mojej konkretnej sytuacji przyczyna mogła być związana z faktem, że powyższy fragment został zdefiniowany w klasie Abstract Activity; dziedziczone i używane przez wiele działań, być może przyczyniło się to do tego, że metoda getApplicationContext () nie zwraca prawidłowego kontekstu? (Tylko przypuszczenie).
źródło
Tworzę widok mapy z wyszczególnionymi nakładkami. Tworzyłem taką szczegółową nakładkę z mojej mapyActivity:
Zauważyłem, że otrzymuję wyjątek „android.view.WindowManager $ BadTokenException: Unable to add window - token null is not for an application”, gdy została wyzwolona metoda onTap mojego elementu itemizedoverlay (gdy lokalizacja jest dotykana w widoku mapy).
Zauważyłem, że jeśli po prostu przekazałem mojemu konstruktorowi polecenie „this” zamiast „getApplicationContext ()”, problem zniknął. Wydaje się, że potwierdza to wniosek alienjazzcat. dziwne.
źródło
Dla działań wyświetlanych w TabActivities użyj getParent ()
zamiast
źródło
Dla Androida 2.2
Użyj tego kodu:
zamiast tego kodu:
Uwaga: Moje niestandardowe okno dialogowe jest tworzone poza
activity.onCreateDialog(int dialogId)
metodą.źródło
Próbować -
źródło
Miałem podobny problem z (kompatybilnością) fragmentami, w których użycie
getActivity()
wewnątrzProgressDialog.show()
powoduje awarię. Zgadzam się, że to z powodu wyczucia czasu.Możliwa poprawka:
zamiast używać
Umieść mContext tak wcześnie, jak to możliwe, aby dać mu więcej czasu na pobranie kontekstu. Nadal nie ma gwarancji, że to zadziała, po prostu zmniejsza prawdopodobieństwo awarii. Jeśli nadal nie działa, musisz skorzystać z hackowania timera (co może powodować inne problemy z synchronizacją, takie jak późniejsze zamknięcie okna dialogowego).
Oczywiście, jeśli możesz użyć
this
lubActivityName.this
, jest bardziej stabilny, ponieważthis
już wskazuje na coś. Ale w niektórych przypadkach, na przykład w przypadku niektórych architektur Fragment, nie jest to możliwe.źródło
(Do przyszłych odniesień)
Myślę, że dzieje się tak, ponieważ istnieją różnice w kontekście aplikacji i kontekście działania, jak wyjaśniono tutaj: http://www.doubleencore.com/2013/06/context/
Co oznacza, że nie możemy wyświetlić okna dialogowego przy użyciu kontekstu aplikacji. Otóż to.
źródło
Aby używać okien dialogowych w działaniach, zrób to w ten sposób:
Aby używać okien dialogowych wewnątrz fragmentów, zrób to w ten sposób:
To wszystko ^ _ ^
źródło
Aby obejść ten problem, utworzyłem klasę bazową dla wszystkich moich działań, w których przechowuję dane globalne. W pierwszym ćwiczeniu zapisałem kontekst w zmiennej w mojej klasie bazowej w następujący sposób:
Klasa podstawowa
Pierwsza aktywność pochodząca z klasy bazowej
Następnie podczas tworzenia okien dialogowych używam mycontext zamiast getApplicationContext.
źródło
Jeśli wywołujesz ProgressDialog.show () we fragmencie, rzutowanie mContext na Activity zadziałało.
źródło
To częsty problem. Użyj
this
zamiastgetApplicationContext()
To powinno rozwiązać twój problemźródło
Zaimplementowałem Alert Dialog dla wyjątków rzucających się w bieżącym widoku aktywności, kiedykolwiek tak dawałem
Biorąc pod uwagę ten sam wyjątek dla okna. Piszę kod dla alertów z onCreate (). Tak prosty, że użyłem
context = this;
posetContentView()
instrukcji wonCreate()
metodzie.Context context;
Przykładowy kod to
Przykładem metody alertu jest
To działa dobrze dla mnie, Właściwie szukałem tego błędu na StackOverflow, znalazłem to zapytanie.Po przeczytaniu wszystkich odpowiedzi tego postu, próbowałem w ten sposób, więc to działa.
Dzięki, Rajendar
źródło
jeśli masz problem z groupActivity, nie używaj tego. PARENT jest statyczną z Parent ActivityGroup.
zamiast
źródło
Okno dialogowe jest zawsze tworzone i wyświetlane jako część działania. Musisz przekazać kontekst działania zamiast kontekstu aplikacji.
http://developer.android.com/guide/topics/ui/dialogs.html#ShowingADialog
źródło