2013-03-02 77 views
18

取消動作條溢出菜單時,這是我得到的警告:警告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.

我的菜單是由一個普通res/menu/activity_menu.xml文件生成。 我正在處理與http://developer.android.com/guide/topics/ui/menus.html#options-menu

上詳細的事件當我點擊垂直三個點打開溢出菜單並取消它時,我得到該警告。似乎沒有什麼知道如何捕捉它的觸發器。有任何想法嗎?

+0

它是一個警告,它不是你的應用程序的一部分。看起來像是Android本身的問題。你應該能夠安全地忽略它 – 2013-03-02 14:05:07

+0

你在使用ActionBar Sherlock嗎? – 2013-03-02 15:53:09

+0

@JustinV。我正在使用Android的股票。 – alexismorin 2013-03-03 02:05:49

回答

14

這與您的工作無關。

溢出菜單由PopupWindow實現。當用戶觸摸關閉PopupWindow時,ACTION_DOWN事件排隊等待應用程序的消息隊列。然後它通過ViewPostImeInputStage類傳遞給View,最後ViewPostImeInputStage將此輸入事件發送到PopupWindow的onTouchEvent偵聽器。

@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()嘗試關閉PopupWindow和PopupWindow :: onDetachedWindow調用WindowInputEventReceiver :: Dispose()方法第一。

然後ViewPostImeInputStage調用WindowInputEventReceiver :: finishInputEvent來完成那個ACTION_DOWN事件。然而,WindowInputEventReceiver實例已經處理完畢,所以它會拋出警告消息。

您可以通過斷點來調試它。打開InputEventReceiver.java(在framework/base /下需要android源代碼),並在dispose方法中設置斷點。

+0

感謝分享!但是如何擺脫這個警告呢?我不太瞭解主要問題?在棉花糖中,一旦PopupMenu解散,鍵盤會自動隱藏並丟失菜單和鍵盤,因爲我使用PopupMenu創建了自定義IME。你能幫忙嗎? – Mohammad 2016-08-08 22:37:30