2013-03-02 6 views
18

Questo è l'avvertimento che sto ricevendo:Attenzione quando si annulla ActionBar menu di overflow su Android 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.

Il menu che ho è stata generata da un normale file di res/menu/activity_menu.xml. Sto gestendo gli eventi esattamente come dettagliato su http://developer.android.com/guide/topics/ui/menus.html#options-menu

Quando faccio clic sui tre punti verticali per aprire il menu di overflow e annullare fuori di esso, ricevo questo avviso. Sembra che ci sia poca conoscenza su come prendere il grilletto. Qualche idea?

+0

È un avviso e non fa parte della tua app. Sembra un problema in Android stesso. Dovresti essere in grado di ignorarlo in modo sicuro –

+0

stai usando ActionBar Sherlock? –

+0

@JustinV. Sto usando Android di serie per questo. – alexismorin

risposta

14

Questo non è correlato al tuo lavoro.

Il menu di overflow è implementato da PopupWindow. Quando l'utente tocca per chiudere PopupWindow, l'evento ACTION_DOWN si è accodato alla coda messaggi dell'app. Quindi viene consegnato a View attraverso la classe ViewPostImeInputStage e infine ViewPostImeInputStage invia questo evento di input al listener onTouchEvent di 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() provare a chiudere PopupWindow e PopupWindow :: onDetachedWindow chiamano WindowInputEventReceiver :: Dispose() prima.

E quindi ViewPostImeInputStage chiama WindowInputEventReceiver :: finishInputEvent per terminare l'evento ACTION_DOWN. Tuttavia, l'istanza di WindowInputEventReceiver è già eliminata, quindi invia messaggi di avviso.

È possibile eseguire il debug in base al punto di interruzione. apri InputEventReceiver.java (necessita del codice sorgente Android su framework/base /) e imposta il punto di interruzione nel metodo di smaltimento.

+0

Grazie per aver condiviso questo! Ma come sbarazzarsi di questo avvertimento? Non capisco abbastanza il problema principale? In Marshmallow, una volta chiuso il PopupMenu, la tastiera viene nascosta automaticamente e perde il menu e la tastiera, poiché ho creato l'IME personalizzato con PopupMenu. Puoi per favore aiutare? – Mohammad