2011-07-01 12 views
10

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?

Odpowiedz

13

Przytrzymujesz odwołanie do kontekstu (jawnie lub przez utworzenie okna dialogowego lub tostu lub innego zależnego elementu), który został zniszczony (zazwyczaj z powodu użycia onCreateDialog lub przekazałeś działanie niektórym inny proces, który nie został zniszczony, gdy działanie zostało zniszczone).

+0

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. –

+0

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

+0

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 –

0

Kiedy wywołałem metodę showContextMenu() po prostu w onResume Złapałem ten sam wyjątek. Rozwiązałem ten problem za pomocą Handler'a

@Override 
protected void onResume() { 
    super.onResume(); 

    if (contextMenuOpened) { 
     new Handler().post(new Runnable() { 
      @Override 
      public void run() { 
       choosePicBtn.showContextMenu(); 
      } 
     }); 
    } 
} 
Powiązane problemy