Próbuję otworzyć okno dialogowe, ale za każdym razem, gdy próbuję je otworzyć, zgłasza ten wyjątek:
Uncaught handler: thread main exiting due to uncaught exception
android.view.WindowManager$BadTokenException:
Unable to add window -- token null is not for an application
at android.view.ViewRoot.setView(ViewRoot.java:460)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
at android.app.Dialog.show(Dialog.java:238)
at android.app.Activity.showDialog(Activity.java:2413)
Tworzę go, dzwoniąc showDialog
z identyfikatorem wyświetlacza. Program onCreateDialog
obsługi rejestruje się poprawnie i mogę bez problemu przejść przez niego, ale załączyłem go, ponieważ wygląda na to, że czegoś mi brakuje:
@Override
public Dialog onCreateDialog(int id)
{
Dialog dialog;
Context appContext = this.getApplicationContext();
switch(id)
{
case RENAME_DIALOG_ID:
Log.i("Edit", "Creating rename dialog...");
dialog = new Dialog(appContext);
dialog.setContentView(R.layout.rename);
dialog.setTitle("Rename " + noteName);
break;
default:
dialog = null;
break;
}
return dialog;
}
Czy czegoś w tym brakuje? Niektóre pytania mówiły o tym problemie podczas tworzenia okna dialogowego onCreate
, co dzieje się, ponieważ działanie nie zostało jeszcze utworzone, ale pochodzi ono z wywołania obiektu menu, a appContext
zmienna wygląda na poprawnie wypełnioną w debuggerze.
Nie można wyświetlić okna aplikacji / okna dialogowego przez kontekst, który nie jest działaniem. Spróbuj przekazać prawidłowe odwołanie do działania
źródło
activity.this
iactivity.getBaseContext()
ale bezskutecznie. Jakaś pomoc?.this
.To samo dotyczy sprawy getApplicationContext.
Dokumenty na stronie Androida mówią, aby z niego korzystać, ale to nie działa ... grrrrr :-P
Po prostu zrób:
„to” jest zazwyczaj Twoją Aktywnością, od której uruchamiasz okno dialogowe.
źródło
Dokumenty Androida sugerują użycie getApplicationContext ();
ale nie będzie działać zamiast tego użyj bieżącej aktywności podczas tworzenia wystąpienia AlertDialog.Builder lub AlertDialog lub Dialog ...
Dawny:
lub
źródło
Zamiast tego po
getApplicationContext()
prostu użyjActivityName.this
źródło
Miałem podobny problem, gdy miałem inną klasę coś takiego:
Przez większość czasu działało dobrze, ale czasami występował błąd z tym samym błędem. Wtedy zdaję sobie sprawę,
MyActivity
że miałem ...Ponieważ trzymałem obiekt jako
static
, drugie uruchomienie kodu nadal zawierało oryginalną wersję obiektu, a zatem nadal odnosiło się do oryginałuActivity
, którego już nie było.Głupi, głupi błąd, zwłaszcza, że tak naprawdę nie musiałem trzymać tego obiektu, tak jak
static
w pierwszej kolejności ...źródło
Po prostu zmień na
Zamiast
źródło
Innym rozwiązaniem jest ustawienie typu okna na okno dialogowe systemu:
Wymaga to
SYSTEM_ALERT_WINDOW
pozwolenia:Jak mówią doktorzy:
Jest to rozwiązanie, z którego należy korzystać tylko wtedy, gdy potrzebujesz okna dialogowego niepowiązanego z działaniem.
źródło
Nie używaj
getApplicationContext()
przy deklarowaniu dialougeZawsze używaj
this
lub twójactivity.this
źródło
W przypadku zagnieżdżonych okien dialogowych ten problem występuje bardzo często. Działa, gdy
jest używany zamiast
ta alternatywa.
źródło
To zadziałało dla mnie--
Posługiwać się
źródło
Możesz także to zrobić
To zadziałało dla mnie !!
źródło
Jak już powiedziano, potrzebujesz działania jako kontekstu dla okna dialogowego, użyj „YourActivity.this” dla kontekstu statycznego lub sprawdź tutaj, jak używać dynamicznego w trybie awaryjnym
źródło
Spróbuj zresetować
dialog
typ okna naNie zapomnij użyć pozwolenia
android.permission.SYSTEM_ALERT_WINDOW
źródło
Tekst tutaj: -
użyj tego do uzyskania
activity
kontekstuprogressdialog
lub
progressdialog = new ProgressDialog(this);
użyj tego, aby uzyskać kontekst aplikacji dla
BroadcastListener
nieprogressdialog
.źródło
Najlepszym i najbezpieczniejszym sposobem pokazania „ProgressDialog” w AsyncTask, unikając problemu wycieku pamięci, jest użycie „Handler” z Looper.main ().
następnie w „onCreate”
Teraz skończyłeś z częścią instalacyjną. Teraz wywołaj „showProgress ()” i „hideProgress ()” w AsyncTask.
źródło