2013-03-02 15 views
18

To ostrzeżenie Dostaję:Ostrzeżenie gdy anulowanie ActionBar menu przepełnienia na Android wersji 4.1.x

03-02 14:38:43.980: W/InputEventReceiver(3961): Attempted to finish an input event but the input event receiver has already been disposed.

Menu Mam została wygenerowana z regularnym res/menu/activity_menu.xml pliku. Obsługuję zdarzenia dokładnie opisane na http://developer.android.com/guide/topics/ui/menus.html#options-menu

Po kliknięciu pionowych trzech kropek, aby otworzyć menu przelewu i anulować go, otrzymuję to ostrzeżenie. Wydaje się, że niewiele wiadomo na temat tego, jak złapać spust. Jakieś pomysły?

+0

Jest to ostrzeżenie i nie jest częścią aplikacji. Wygląda na problem w samym systemie Android. Powinieneś być w stanie zignorować to bezpiecznie –

+0

używasz ActionBar Sherlock? –

+0

@JustinV. Używam do tego celu systemu Android. – alexismorin

Odpowiedz

14

Nie jest to związane z Twoją pracą.

Menu przepełnienia realizowane jest przez PopupWindow. Gdy użytkownik kliknie, aby zamknąć okno PopupWindow, zdarzenie ACTION_DOWN ustawiło się w kolejce do kolejki komunikatów aplikacji. Następnie jest dostarczany do klasy View poprzez ViewPostImeInputStage, a na końcu ViewPostImeInputStage wysyła to zdarzenie wejściowe do odbiornika onTouchEvent programu PopupWindow.

@Override 
    public boolean onTouchEvent(MotionEvent event) { 
     final int x = (int) event.getX(); 
     final int y = (int) event.getY(); 

     if ((event.getAction() == MotionEvent.ACTION_DOWN) 
       && ((x < 0) || (x >= getWidth()) || (y < 0) || (y >= getHeight()))) { 
      dismiss(); 
      return true; 
     } else if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { 
      dismiss(); 
      return true; 
     } else { 
      return super.onTouchEvent(event); 
     } 
    } 

dissmiss() spróbuj zamknąć PopupWindow i PopupWindow :: onDetachedWindow zadzwonić WindowInputEventReceiver :: rozporządzania() pierwsza.

Następnie wywołaj ViewPostImeInputStage WindowInputEventReceiver :: finishInputEvent, aby zakończyć wydarzenie ACTION_DOWN. Jednak instancja WindowInputEventReceiver jest już utylizowana, więc wysyła komunikaty ostrzegawcze.

Można debugować go według punktu przerwania. otwórz InputEventReceiver.java (potrzebujesz kodu źródłowego Android w frameworku/base /) i ustaw punkt przerwania w metodzie dispose.

+0

Dzięki za podzielenie się tym! Ale jak pozbyć się tego ostrzeżenia? Nie rozumiem głównego problemu? W Marshmallow, po opuszczeniu PopupMenu klawiatura jest automatycznie ukrywana i traci menu oraz klawiaturę, ponieważ utworzyłem niestandardowy edytor IME z PopupMenu. Czy możesz mi pomóc? – Mohammad