Mam problem z otrzymaniem BadTokenException
, gdy ekran przekroczy limit czasu, a następnie użytkownik wróci do mojej aplikacji. Mam przycisk, który otwiera się po kliknięciu na ContextMenu
.BadTokenException: Nie można dodać okna
Działa normalnie, ale gdy użytkownik pozwala na przekroczenie limitu czasu ekranu, a następnie wraca do aplikacji, zostaje zgłoszony BadTokenException
.
07-01 14:46:42.763: WARN/WindowManager(1105): Attempted to add window with token that is a sub-window: [email protected] Aborting.
07-01 14:46:42.771: WARN/System.err(1725): at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459)
07-01 14:46:42.771: WARN/System.err(1725): at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459)
07-01 14:46:42.771: WARN/System.err(1725): at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459)
07-01 14:46:42.771: WARN/System.err(1725): at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459)
07-01 14:46:42.771: WARN/System.err(1725): at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459)
07-01 14:46:42.771: WARN/System.err(1725): at android.view.View.showContextMenu(View.java:2444)
07-01 14:46:42.771: WARN/System.err(1725): at com.??.??.ui.cards.ViewActivity$3.onClick(ViewActivity.java:353)
07-01 14:46:42.771: WARN/System.err(1725): at android.view.View.performClick(View.java:2408)
07-01 14:46:42.771: WARN/System.err(1725): at android.view.View$PerformClick.run(View.java:8816)
07-01 14:46:42.771: WARN/System.err(1725): at android.os.Handler.handleCallback(Handler.java:587)
07-01 14:46:42.771: WARN/System.err(1725): at android.os.Handler.dispatchMessage(Handler.java:92)
07-01 14:46:42.771: WARN/System.err(1725): at android.os.Looper.loop(Looper.java:123)
07-01 14:46:42.771: WARN/System.err(1725): at android.app.ActivityThread.main(ActivityThread.java:4627)
07-01 14:46:42.771: WARN/System.err(1725): at java.lang.reflect.Method.invokeNative(Native Method)
07-01 14:46:42.771: WARN/System.err(1725): at java.lang.reflect.Method.invoke(Method.java:521)
07-01 14:46:42.771: WARN/System.err(1725): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
07-01 14:46:42.771: WARN/System.err(1725): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
07-01 14:46:42.771: WARN/System.err(1725): at dalvik.system.NativeStart.main(Native Method)
07-01 14:46:43.005: WARN/System.err(1725): android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running?
07-01 14:46:43.005: WARN/System.err(1725): at android.view.ViewRoot.setView(ViewRoot.java:505)
07-01 14:46:43.005: WARN/System.err(1725): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
07-01 14:46:43.005: WARN/System.err(1725): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
07-01 14:46:43.005: WARN/System.err(1725): at android.view.Window$LocalWindowManager.addView(Window.java:424)
07-01 14:46:43.005: WARN/System.err(1725): at android.app.Dialog.show(Dialog.java:241)
07-01 14:46:43.005: WARN/System.err(1725): at com.android.internal.view.menu.MenuDialogHelper.show(MenuDialogHelper.java:86)
07-01 14:46:43.005: WARN/System.err(1725): at com.android.internal.view.menu.ContextMenuBuilder.show(ContextMenuBuilder.java:88)
07-01 14:46:43.005: WARN/System.err(1725): at com.android.internal.policy.impl.PhoneWindow$DecorView.showContextMenuForChild(PhoneWindow.java:1860)
07-01 14:46:43.005: WARN/System.err(1725): at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459)
07-01 14:46:43.005: WARN/System.err(1725): at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459)
07-01 14:46:43.005: WARN/System.err(1725): at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459)
07-01 14:46:43.005: WARN/System.err(1725): at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459)
07-01 14:46:43.005: WARN/System.err(1725): at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459)
07-01 14:46:43.005: WARN/System.err(1725): at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459)
Gdybym złapać wyjątek, nigdy przycisk otwiera ContextMenu w tym przypadku, ale inne elementy sterujące na stronie nadal działać.
Gdybym zminimalizować aplikację z ekranu głównego, a następnie powrócić, aplikacja ulega awarii z następującym Ślad:
07-01 15:10:50.439: ERROR/AndroidRuntime(1931): FATAL EXCEPTION: main
07-01 15:10:50.439: ERROR/AndroidRuntime(1931): java.lang.NullPointerException
07-01 15:10:50.439: ERROR/AndroidRuntime(1931): at android.view.WindowManagerImpl.removeViewLocked(WindowManagerImpl.java:239)
07-01 15:10:50.439: ERROR/AndroidRuntime(1931): at android.view.WindowManagerImpl.closeAll(WindowManagerImpl.java:293)
07-01 15:10:50.439: ERROR/AndroidRuntime(1931): at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3687)
07-01 15:10:50.439: ERROR/AndroidRuntime(1931): at android.app.ActivityThread.access$2900(ActivityThread.java:125)
07-01 15:10:50.439: ERROR/AndroidRuntime(1931): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
07-01 15:10:50.439: ERROR/AndroidRuntime(1931): at android.os.Handler.dispatchMessage(Handler.java:99)
07-01 15:10:50.439: ERROR/AndroidRuntime(1931): at android.os.Looper.loop(Looper.java:123)
07-01 15:10:50.439: ERROR/AndroidRuntime(1931): at android.app.ActivityThread.main(ActivityThread.java:4627)
07-01 15:10:50.439: ERROR/AndroidRuntime(1931): at java.lang.reflect.Method.invokeNative(Native Method)
07-01 15:10:50.439: ERROR/AndroidRuntime(1931): at java.lang.reflect.Method.invoke(Method.java:521)
07-01 15:10:50.439: ERROR/AndroidRuntime(1931): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
07-01 15:10:50.439: ERROR/AndroidRuntime(1931): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
07-01 15:10:50.439: ERROR/AndroidRuntime(1931): at dalvik.system.NativeStart.main(Native Method)
Oto jak ja dodając ContextMenu:
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (contextMenuOpen) return;// popup options
contextMenuOpen = view.showContextMenu();
}
I nie wywołuj registerForContextMenu za pomocą przycisku, ale raczej sam widok główny. Czy to jest nieprawidłowe?
Dziękuję za odpowiedź. Czy chcesz spojrzeć na moją edycję na oryginalny wpis i upewnić się, że jest poprawny? Otrzymuję poprawne odwołanie do widoku wewnątrz funkcji onClick. –
To naprawdę za mało, aby powiedzieć, co robisz źle: naprawdę trzeba spojrzeć na więcej kodu, aby określić szczegóły. Możesz spróbować przenieść wywołanie 'setOnClickListener' do wywołania zwrotnego' onResume' dla działania (upewnij się, że wywołujesz metodę nadklasy również, gdy nadpisujesz 'onResume') i sprawdzasz, czy nadal masz problem. – Femi
Rozwiązałem to na razie inną trasą, która prawdopodobnie nie dotyczyłaby nikogo innego, a tak naprawdę nie rozwiązałem problemu, więc nie wyjaśnię tego tutaj. Dzięki –